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

Pet*_*erB 2 javascript underscore.js lodash

我有以下结构

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 },
];
Run Code Online (Sandbox Code Playgroud)

我想把它改造成:

{ 
    "2016-06-24": [null], 
    "2016-06-25": [32, null], 
    "2016-06-26": [151, null, 11], 
    "2016-06-27": [null, 31], 
    "2016-06-28": [31] 
}
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最短方法是什么?我使用 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

它类似于使用 lodash 将对象数组转换为数组对象,但每个对象中都存在所有键。

Geo*_*kas 5

您可以使用以下代码片段来完成此操作(不需要 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)
Run Code Online (Sandbox Code Playgroud)