Javascript:按键对多个数组求和的最有效方法

Javascript:按键对多个数组求和的最有效方法,javascript,arrays,loops,for-loop,Javascript,Arrays,Loops,For Loop,我有一个从web服务返回的JSON对象,它是一个对象数组。我需要将“数据”数组添加到一起,形成一个求和数组。JSON响应如下所示: [ { "data":[ 0,3,8,2,5 ], "someKey":"someValue" }, { "data":[ 3,13,1,0,5 ], "someKey":"someOtherValue" } ] 数组中可能有N个对象。上述示例的期望输出

我有一个从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中对应的键按值递增


是否有更有效的方法使用某种合并功能来执行此操作?

如果每个对象都具有相同的
数据长度,您可以尝试使用:

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]

如果每个对象都具有相同的
数据
长度,则可以尝试使用:

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]

如果每个对象都具有相同的
数据
长度,则可以尝试使用:

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]

如果每个对象都具有相同的
数据
长度,则可以尝试使用:

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]

稍微不那么迫切的解决方案:

//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; });
    });

稍微不那么迫切的解决方案:

//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; });
    });

稍微不那么迫切的解决方案:

//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; });
    });

稍微不那么迫切的解决方案:

//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; });
    });

这个怎么样,我相信它应该适用于所有情况

var数据=[{
“数据”:[
0, 3, 8, 2, 5
],
“someKey”:“someValue”
}, {
“数据”:[
3, 13, 1, 0, 5
],
“someKey”:“someOtherValue”
}];
var数据=数据.reduce(函数(a,b){
b、 data.forEach(函数(x,i){
a[i]=a[i]| 0;
a[i]+=x;
});
返回a;
}, []);

控制台日志(数据)这个怎么样,我相信它应该适用于所有情况

var数据=[{
“数据”:[
0, 3, 8, 2, 5
],
“someKey”:“someValue”
}, {
“数据”:[
3, 13, 1, 0, 5
],
“someKey”:“someOtherValue”
}];
var数据=数据.reduce(函数(a,b){
b、 data.forEach(函数(x,i){
a[i]=a[i]| 0;
a[i]+=x;
});
返回a;
}, []);

控制台日志(数据)这个怎么样,我相信它应该适用于所有情况

var数据=[{
“数据”:[
0, 3, 8, 2, 5
],
“someKey”:“someValue”
}, {
“数据”:[
3, 13, 1, 0, 5
],
“someKey”:“someOtherValue”
}];
var数据=数据.reduce(函数(a,b){
b、 data.forEach(函数(x,i){
a[i]=a[i]| 0;
a[i]+=x;
});
返回a;
}, []);

控制台日志(数据)这个怎么样,我相信它应该适用于所有情况

var数据=[{
“数据”:[
0, 3, 8, 2, 5
],
“someKey”:“someValue”
}, {
“数据”:[
3, 13, 1, 0, 5
],
“someKey”:“someOtherValue”
}];
var数据=数据.reduce(函数(a,b){
b、 data.forEach(函数(x,i){
a[i]=a[i]| 0;
a[i]+=x;
});
返回a;
}, []);


控制台日志(数据)数据<代码>数组是否始终具有相同的长度?是的,对于每个对象,它将具有相同的长度<代码>数据<代码>数组是否始终具有相同的长度?是的,对于每个对象,它将具有相同的长度<代码>数据<代码>数组是否始终具有相同的长度?是的,对于每个对象,它将具有相同的长度<代码>数据<代码>数组是的,每个物体的长度都是一样的。对不起,我误解了你在评论中提出的问题。“数据”并不总是5,它可以是任意长度,但每个对象的长度都是相同的(如果清楚:)@ExoticChimp固定为任意长度。用“input[0].data.length”更改硬编码的“5”应该可以做到这一点(假设每个数据集中始终有1+个条目……如果可能有空数据集,请首先检查该项)。也就是说,我建议您实施您针对问题提出的直截了当的解决方案,并将其与此建议进行对比;除非在执行时间上存在显著差异,否则我倾向于使用循环,因为它可能更易于维护和一眼就能理解。我认为,就我个人而言,我喜欢第一个解决方案h检查一个空数据集,它具有足够的可读性。虽然你是对的,但我应该对它们进行基准测试,并查看啊抱歉我误解了你在评论中的问题。“数据”不总是5,它可以是任何长度,但每个对象的长度总是相同的(如果清楚:)@ExoticChimp对任何长度都是固定的。将硬编码的“5”更改为“input[0]。data.length”应该可以做到这一点(假设每个数据集中始终有1+个条目……如果可能存在空数据集,请首先检查该项)。也就是说,我建议你实施你就你的问题提出的直截了当的解决方案,并将其与这一建议进行对比;除非在执行时间上有显著差异,否则我更倾向于使用循环,因为它可能更易于维护和一眼就能理解。我认为,就我个人而言,我喜欢第一个解决方案,它可以检查空数据集,并且具有足够的可读性。虽然你是对的,但我应该对它们进行基准测试,看看啊,对不起,我在评论中误解了你的问题。“数据”并不总是5,它可以是任意长度,但每个对象的长度都是相同的(如果清楚:)@ExoticChimp固定为任意长度。用“input[0].data.length”更改硬编码的“5”应该可以做到这一点(假设每个数据集中始终有1+个条目……如果可能有空数据集,请首先检查该项)。也就是说,我建议您实施您针对问题提出的直截了当的解决方案,并将其与此建议进行对比;除非在执行时间上存在显著差异,否则我倾向于使用循环,因为它可能更易于维护和一眼就能理解。我认为,就我个人而言,我喜欢第一个解决方案h检查一个空数据集,它具有足够的可读性。虽然你是对的,但我应该对它们进行基准测试,并查看啊抱歉我误解了你在评论中的问题。“数据”不总是5,它可以是任何长度,但每个对象的长度总是相同的(如果清楚:)@ExoticChimp固定任何长度。更改硬编码“5”