首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript:按键求和多个数组的最有效方法

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

Stack Overflow用户
提问于 2015-10-22 18:15:05
回答 3查看 57关注 0票数 0

我有一个从web服务返回的JSON对象,它是一个对象数组。我需要将“数据”数组相加在一起,形成一个相加的数组。JSON响应如下所示:

代码语言:javascript
复制
[  
  {  
    "data":[  
       0,3,8,2,5
    ],
    "someKey":"someValue"
  },
  {  
    "data":[  
       3,13,1,0,5
    ],
    "someKey":"someOtherValue"
  }
]

数组中可能有N个对象。上述示例的期望输出是:

代码语言:javascript
复制
[3, 16, 9, 2, 10]

我打算创建一个空数组变量(var arr),然后遍历对象,对于每个对象,循环遍历"data“键,并为每个键循环arr中的相应键。

是否有一种使用某种合并函数的更有效的方法来做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-22 18:25:03

如果每个对象具有相同的data长度,则可以尝试:

代码语言:javascript
复制
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大小:

代码语言:javascript
复制
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]
票数 1
EN

Stack Overflow用户

发布于 2015-10-22 18:53:13

这个怎么样,我认为它应该适用于所有的情况。

代码语言:javascript
复制
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);

票数 2
EN

Stack Overflow用户

发布于 2015-10-22 18:35:13

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

代码语言:javascript
复制
//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; });
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33287889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档