Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中转换对象数组_Javascript_Arrays_Object_Format - Fatal编程技术网

在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

我正在尝试用javascript转换对象数组。下面是一个原始数据示例,以及格式化数组的外观。我试着用一些循环和if,else语句来实现这一点,但没有弄明白。必须有一种更有效的方法来使用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 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;
},[]);