最好使用Lo-Dash或Underscore方法,有没有办法“合并”一组类似对象的值?
例如,我想采用这样的数组。 。
[
{x: 1, y: 2, z: 3},
{x: 4, y: 5, z: 6}
]
。 。 。并将其转化为此。 。
{
x: [1, 4],
y: [2, 5],
z: [3, 6]
}
答案 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
答案 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 ] }