重新排列 JavaScript 数组/对象

Rearranging javascript array / object

本文关键字:JavaScript 数组 对象 排列 新排列      更新时间:2023-09-26

我正在尝试重新排列:

[
    {"Appointment":"6","Converted":"0","Lead":"9","Qualified":"0","Dead":"0"},
    {"Appointment":"1","Converted":"0","Lead":"1","Qualified":"0","Dead":"0"},
    {"Appointment":"1","Converted":"0","Lead":"0","Qualified":"0","Dead":"0"}
]

自:

[
    {"name":"Appointment", "data":[6,1,1]},
    {"name":"Converted", "data":[0,0,0]},
    {"name":"Lead", "data":[9,1,0]},
    {"name":"Qualified", "data":[0,0,0]},
    {"name":"Dead", "data":[0,0,0]}
]

我已经设法通过执行 for(obj 中的 var prop)循环来获取具有正确名称的 5 个数组,但我想知道如何实现数据部分的转换。 也许是一厢情愿的想法,但有没有比循环中循环更简单的方法!?

解决方案必须是动态的...可能像我的例子一样有 3 个数组,或多或少。 但是,属性的数量将始终增加 5,如示例中所示。

您可以将键分组到对象中,然后放入数组中...就像在小提琴中一样...

http://jsfiddle.net/u7xLnmuh/

var data = [
    {"Appointment":"6","Converted":"0","Lead":"9","Qualified":"0","Dead":"0"},
    {"Appointment":"1","Converted":"0","Lead":"1","Qualified":"0","Dead":"0"},
    {"Appointment":"1","Converted":"0","Lead":"0","Qualified":"0","Dead":"0"}
]

function groupByKey(data){
    var grouped = {};
    var result = [];
    data.forEach(function(row){
        for(var property in row){
            if(!(property in grouped)){
                grouped[property] = [];
            }
            grouped[property].push(+row[property]);            
        }        
    });
    for(var property in grouped){
        result.push({
            name: property,
            data: grouped[property]
        });
    }
    return result;
}

var groupedData = groupByKey(data));

此解决方案适用于输入的任何数据集

使结果成为其键是名称的对象,因为查找以下内容更容易:

var result = {};
for (var key in input[0]) {
    result[key] = [];
}
for (var i = 0; i < input.length; i++) {
    var obj = input[i];
    for (key in obj) {
        result[key].push(parseInt(obj[key], 10));
    }
}

如果您确实需要将结果作为对象数组,则可以转换result

var result_array = [];
for (var name in result) {
    result_array.push({name: name, data: result[name]});
}