在Javascript中转换对象数组
我正在尝试用javascript转换对象数组。下面是一个原始数据示例,以及格式化数组的外观。我试着用一些循环和if,else语句来实现这一点,但没有弄明白。必须有一种更有效的方法来使用javascript完成这样的任务?我是javascript新手,非常感谢您的帮助,谢谢 我试过这个在Javascript中转换对象数组,javascript,arrays,object,format,Javascript,Arrays,Object,Format,我正在尝试用javascript转换对象数组。下面是一个原始数据示例,以及格式化数组的外观。我试着用一些循环和if,else语句来实现这一点,但没有弄明白。必须有一种更有效的方法来使用javascript完成这样的任务?我是javascript新手,非常感谢您的帮助,谢谢 我试过这个 // get formatted reports array $scope.reports = []; var num = 1; // console.log("re
// 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 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",
}
];
Array.reduce
是您的朋友。通常,我建议使用id作为键简化为对象,但由于您的键无论如何都是数字的,因此我们可以直接将它们用作数组的键:
var raw\u arr=[
{
“创建时间”:“2016-05-04T16:45:07.000Z”,
“全名”:“迪克”,
“报告id”:1,
“阶段”:1
},
{
“创建时间”:“2016-05-04T16:45:07.000Z”,
“全名”:“汤姆”,
“报告id”:1,
“阶段”:2
},
{
“创建时间”:“2016-05-04T16:45:07.000Z”,
“全名”:“哈利”,
“报告id”:1,
“阶段”:3
},
{
“创建时间”:“2016-05-04T16:45:07.000Z”,
“全名”:“约翰”,
“报告id”:2,
“阶段”:1
},
{
“创建时间”:“2016-05-04T16:45:07.000Z”,
“全名”:“迈克”,
“报告id”:2,
“阶段”:2
},
{
“创建时间”:“2016-05-04T16:45:07.000Z”,
“全名”:“查尔斯”,
“报告id”:2,
“阶段”:3
}
];
var outputArr=raw_arr.reduce(函数(p,c){
如果(!p[c.report_id-1]){
p[c.report_id-1]={
创建时间:c.创建时间:,
报告id:c.报告id
}
}
p[c.报告id-1][“审查者”+c.阶段]=c.全名;
返回p;
},[]);
log(JSON.stringify(outputArr));
重要的部分在这里:
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;
},[]);
那么您想按
report\u id
对原始数组进行分组,并将每个人添加到新对象中?“我试着用一些循环和if,else语句来实现这一点,但没有弄明白。”那么代码在哪里呢?这不是“格式化”数组,而是“转换”数组到不同的数组array@Matt伯兰,就是这样correct@MattBurland,请查看编辑内容。。任何建议都会很感激的,但对我来说不起作用。。。ReferenceError:lodash不是defined@MattBurland我的答案是更好的汉克斯!这是一个很好的解决方案
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;
});
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;
},[]);