将对象数组转换为数组对象

问题描述 投票:0回答:3

我有以下结构

var nights = [
    { "2016-06-25": 32, "2016-06-26": 151, "2016-06-27": null },
    { "2016-06-24": null, "2016-06-25": null, "2016-06-26": null },
    { "2016-06-26": 11, "2016-06-27": 31, "2016-06-28": 31 },
];

我想将其转换为:

{ 
    "2016-06-24": [null], 
    "2016-06-25": [32, null], 
    "2016-06-26": [151, null, 11], 
    "2016-06-27": [null, 31], 
    "2016-06-28": [31] 
}

解决这个问题的最短途径是什么?我使用Underscore,Lodash或jQuery没有问题。

我目前的代码是:

var out = {};
for (var i = 0; i < nights.length; i++) {
    for (var key in nights[i]) {
        if (out[key] === undefined) {
            out[key] = [];
        }
        out[key].push(nights[i][key]);
    }
}

它与Convert array of objects to object of arrays using lodash类似,但每个对象都有关键字。

javascript underscore.js lodash
3个回答
2
投票

您可以使用以下代码段(不需要lodash等)来执行此操作:

const x = [{ '2016-06-25': 32, '2016-06-26': 151, '2016-06-27': null }, { '2016-06-24': null, '2016-06-25': null, '2016-06-26': null }, { '2016-06-26': 11, '2016-06-27': 31, '2016-06-28': 31 }, ];
let y = {};

x.forEach(obj => {
  Object.keys(obj).forEach(key => {
    y[key] = (y[key] || []).concat([obj[key]]);
  });
});

console.log(y)

0
投票

您可以迭代数组和对象的键,并使用键作为新键构建一个新对象。

var data = [{ '2016-06-25': 32, '2016-06-26': 151, '2016-06-27': null }, { '2016-06-24': null, '2016-06-25': null, '2016-06-26': null }, { '2016-06-26': 11, '2016-06-27': 31, '2016-06-28': 31 }, ],
    result = {};

data.forEach(function (o) {
    Object.keys(o).forEach(function (k) {
        result[k] = result[k] || [];
        result[k].push(o[k]);
    });
});

console.log(result);

0
投票

使用的Typescript - 显然你可以在使用JavaScript时删除类型。

假设:进入函数的对象数组将始终具有相同种类和数量的对象键

mapperArrayOfJsonsToJsonOfArrays(inputArrayOfJsons: any): any {
    if (inputArrayOfJsons.length > 0) {
        let resultMap = {};
        let keys: any[] = Object.keys(inputArrayOfJsons[0]);
        keys.forEach((key: any) => {
            resultMap[key] = [];
        });

        inputArrayOfJsons.forEach((element: any) => {
            let values: any[] = Object.values(element);
            let index = 0;
            values.forEach((value: any) => {
                resultMap[keys[index]].push(value);
                index = index + 1;
            });
        });
        return resultMap;
    }
    return {};
}

0
投票

这是我的单行。使用map将键映射到具有键属性的对象数组中。然后将原始数组映射到该属性,并将其设置为属性的值。这种方式的一个问题是它只使用数组中第一个对象的属性。因此,如果其他对象具有不在第一个对象中的属性,则将忽略它们。

const output = Object.assign({}, ...Object.keys(input[0]).map(props => ({[props]: input.map(prop => prop[props])})))

编辑:输出格式错误,已修复

© www.soinside.com 2019 - 2024. All rights reserved.