2016-05-18 2 views
-1

Я пытаюсь преобразовать массив объектов с помощью javascript. Ниже приведен пример необработанных данных и то, как должен выглядеть форматированный массив. Я попытался выполнить это с помощью некоторых циклов, а если, else, но не смог понять это. Должен быть более эффективный способ выполнения такой задачи с помощью javascript? Я новичок в работе с javascript, поэтому любая помощь очень ценится, спасибо.Преобразование массива объектов в Javascript

Я попытался это ...

// get formatted reports array 
     $scope.reports = []; 
     var num = 1; 
     // console.log("reports: ", $scope.reports_data); 
     for(var i=0; i<$scope.reports_data.length; i++) { 
      var row = { 
       "reviewer_1" : "", 
       "reviewer_2" : "", 
       "reviewer_3" : "", 
       "created_at" : "" 
      }; 
      if(num == $scope.reports_data[i].report_id) { 
       row.created_at = $scope.reports_data[i].created_at; 
       if($scope.reports_data[i].stage == 1) { 
        row.reviewer_1 = $scope.reports_data[i].full_name; 
       } else if($scope.reports_data[i].stage == 2) { 
        row.reviewer_2 = $scope.reports_data[i].full_name; 
       } else { 
        row.reviewer_3 = $scope.reports_data[i].full_name; 
       } 
      } 
      $scope.reports.push(row); 
      num += 1; 
     } 

До:

var raw_arr = [ 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Dick", 
     "report_id" : 1, 
     "stage" : 1 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Tom", 
     "report_id" : 1, 
     "stage" : 2 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Harry", 
     "report_id" : 1, 
     "stage" : 3 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"John", 
     "report_id" : 2, 
     "stage" : 1 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Mike", 
     "report_id" : 2, 
     "stage" : 2 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Charles", 
     "report_id" : 2, 
     "stage" : 3 
    } 
]; 

После:

var formatted_arr = [ 
     { 
      "created_at": "2016-05-04T16:45:07.000Z", 
      "report_id": 1, 
      "reviewer_1": "Dick", 
      "reviewer_2": "Tom", 
      "reviewer_3": "Harry", 
     }, 
     { 
      "created_at": "2016-05-04T16:45:07.000Z", 
      "report_id": 2, 
      "reviewer_1": "John", 
      "reviewer_2": "Mike", 
      "reviewer_3": "Charles", 
     } 
    ]; 
+1

Итак, вы хотите сгруппировать исходный массив 'report_id' и добавить каждого человека к новому объекту? * «Я пробовал выполнить это с помощью некоторых циклов, а если, else, но не мог понять это». * Так где же этот код? –

+2

И это не «форматирование» массива, это «преобразование» массива в другой массив –

+0

@Matt Burland, который является правильным –

ответ

1

Array.reduce ваш друг здесь. Обычно я предлагаю сократить до объекта с использованием идентификатора в качестве ключа, но поскольку ключи являются числами в любом случае, мы можем просто использовать их в качестве ключей массива непосредственно:

var raw_arr = [ 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Dick", 
     "report_id" : 1, 
     "stage" : 1 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Tom", 
     "report_id" : 1, 
     "stage" : 2 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Harry", 
     "report_id" : 1, 
     "stage" : 3 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"John", 
     "report_id" : 2, 
     "stage" : 1 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Mike", 
     "report_id" : 2, 
     "stage" : 2 
    }, 
    { 
     "created_at" :"2016-05-04T16:45:07.000Z", 
     "full_name" :"Charles", 
     "report_id" : 2, 
     "stage" : 3 
    } 
]; 

var outputArr = raw_arr.reduce(function(p,c) { 
    if (!p[c.report_id - 1]) { 
     p[c.report_id - 1] = { 
      created_at: c.created_at, 
      report_id: c.report_id 
     } 
    } 
    p[c.report_id - 1]["reviewer_" + c.stage] = c.full_name; 
    return p; 
},[]); 

console.log(JSON.stringify(outputArr)); 

Важной частью находится здесь:

+0

Спасибо! это отличное решение –

0
var grouped = lodash.groupBy(raw_array, 'report_id'); 
lodash.map(grouped, function(collection) { 
    var result = collection[0]; 
    delete result.full_name; 
    delete result.stage; 
    lodash.map(collection, function(item, i) { 
     result['reviewer_' + (i + 1)] = item.full_name; 
    }); 
    return result; 
}); 
+0

Не работает для меня ... ReferenceError: lodash не определен –

+0

вам нужно будет включить lodash https://lodash.com/ – UtsavShah

+0

@ Ответ MattBurland лучше –

Смежные вопросы