合并一组类似对象的值

时间:2014-02-03 16:29:22

标签: javascript underscore.js lodash

最好使用Lo-Dash或Underscore方法,有没有办法“合并”一组类似对象的值?

例如,我想采用这样的数组。 。

[
  {x: 1, y: 2, z: 3},
  {x: 4, y: 5, z: 6}
]

。 。 。并将其转化为此。 。

{
  x: [1, 4],
  y: [2, 5],
  z: [3, 6]
}

5 个答案:

答案 0 :(得分:2)

使用下划线:

var input = [
  {x: 1, y: 2, z: 3},
  {x: 4, y: 5, z: 6}
];

var output = {};

for(var k in input[0]) {
    output[k] = _.keys(_.groupBy(input, function(value) {
        return value[k];
    }));
}

console.log(output);

控制台输出:

v Object {x: Array[2], y: Array[2], z: Array[2]}
  v x: Array[2]
    0: "1"
    1: "4"
    length: 2
    __proto__: Array[0]
  v y: Array[2]
    0: "2"
    1: "5"
    length: 2
    __proto__: Array[0]
  v z: Array[2]
    0: "3"
    1: "6"
    length: 2
    __proto__: Array[0]
  __proto__: Object

jsfiddle

答案 1 :(得分:1)

一个普通的JS解决方案:

var input = [
  {x: 1, y: 2, z: 3},
  {x: 4, y: 5, z: 6}
];

var output = { };
input.forEach(function(item){
  for (var key in item) {
    if (!output[key]) output[key] = [ item[key] ];
    else output[key].push(item[key]);
  }
});

答案 2 :(得分:1)

您可以使用

var input = [
  {x: 1, y: 2, z: 3},
  {x: 4, y: 5, z: 6}
];
var output = input.reduce(function(output, item){
  for (var key in item) { if (item.hasOwnProperty(key)) {
    if (!output[key]) output[key] = [ item[key] ];
    else output[key].push(item[key]);
  } }
  return output;
}, {});

(基于@Tibos答案,但使用reduce代替forEach,并检查hasOwnProperty)。

答案 3 :(得分:1)

已经while解决方案。假设您的数组绑定到名为source的变量:

var o = {},
    i = 0,
    item, k;
while (item = source[i++]) {
    for (k in item) {
        if (!o[k]) o[k] = [item[k]];
        else o[k].push(item[k]);
    }
}

答案 4 :(得分:1)

我确信这就是你的目标

var data = [{x: 1, y: 2, z: 3}, {x: 4, y: 5, z: 6}];

console.log(_.merge(data[0], data[1], function(a, b) {
    return [a, b];
}));
# { x: [ 1, 4 ], y: [ 2, 5 ], z: [ 3, 6 ] }

对于数组中的N个对象,

var data = [{x: 1, y: 2, z: 3}, {x: 4, y: 5, z: 6}, {x: 7, y: 8, z: 9}];

console.log(_.merge.apply(null, data.concat(function(a, b) {
    return _.isArray(a) ? a.concat(b): [a, b];
})));
# { x: [ 1, 4, 7 ], y: [ 2, 5, 8 ], z: [ 3, 6, 9 ] }