我有一个从web服务返回的JSON对象,它是一个对象数组。我需要将“数据”数组相加在一起,形成一个相加的数组。JSON响应如下所示:
[
{
"data":[
0,3,8,2,5
],
"someKey":"someValue"
},
{
"data":[
3,13,1,0,5
],
"someKey":"someOtherValue"
}
]数组中可能有N个对象。上述示例的期望输出是:
[3, 16, 9, 2, 10]我打算创建一个空数组变量(var arr),然后遍历对象,对于每个对象,循环遍历"data“键,并为每个键循环arr中的相应键。
是否有一种使用某种合并函数的更有效的方法来做到这一点?
发布于 2015-10-22 18:25:03
如果每个对象具有相同的data长度,则可以尝试:
var input; // Your input data
var output = [];
for (var i = 0; i < input[0].data.length; i++) {
output[i] = input.reduce(function(prev, item) {
return +(item.data[i]) + prev;
}, 0);
}
console.log(output);
// [3, 16, 9, 2, 10]如果每个对象都有不同的data大小:
var input; // Your input data
var i = 0, output = [];
while (true) {
var outOfIndex = true;
var sum = input.reduce(function(prev, item) {
if (item.data[i] !== undefined) {
outOfIndex = false;
}
return +(item.data[i]) + prev;
}, 0);
if (outOfIndex) {
break;
}
output[i++] = sum;
}
console.log(output);
// [3, 16, 9, 2, 10]发布于 2015-10-22 18:53:13
这个怎么样,我认为它应该适用于所有的情况。
var data = [{
"data": [
0, 3, 8, 2, 5
],
"someKey": "someValue"
}, {
"data": [
3, 13, 1, 0, 5
],
"someKey": "someOtherValue"
}];
var datas = data.reduce(function(a, b) {
b.data.forEach(function(x, i) {
a[i] = a[i] || 0;
a[i] += x;
});
return a;
}, []);
console.log(datas);
发布于 2015-10-22 18:35:13
稍微不那么迫切的解决方案:
//zip takes two arrays and combines them per the fn argument
function zip(left, right, fn) {
var shorter = (right.length > left.length) ? left : right;
return shorter.map(function(value, i) {
return fn(left[i], right[i]);
});
}
//assuming arr is your array of objects. Because were using
//zip, map, and reduce, it doesn't matter if the length of the
//data array changes
var sums = arr
.map(function(obj) { return obj.data; })
.reduce(function(accum, array) {
//here we want to combine the running totals w/the current data
return zip(accum, array, function(l, r) { return l + r; });
});https://stackoverflow.com/questions/33287889
复制相似问题