如何计算多个数组的总和?

时间:2019-02-15 15:51:24

标签: javascript arrays math

我正在尝试求解一个方程,在该方程中我从索引后面的数组列表中添加数字。

列表的每个数组都是随机生成的4个数字的定长数组,如下所示:

const list = [
  [2, 9, 1, 2],
  [2, 3, 9, 4],
  [4, 7, 8, 1]
]

所以我想做的是从每个数组中获取每个索引的每个数字的总和。像这样:

const list = [
  [2, 9, 1, 2],
  [2, 3, 9, 4],
  [4, 7, 8, 1]
]

// expectedResult = [8, 19, 18, 7];

我该如何实现?

6 个答案:

答案 0 :(得分:2)

这是另一种在第一个数组上使用map()并与reduce()嵌套的方法,该数组生成了相应列的总数。

const list = [
  [2, 9, 1, 2],
  [2, 3, 9, 4],
  [4, 7, 8, 1]
];

let sums = list[0].map(
    (x, idx) => list.reduce((sum, curr) => sum + curr[idx], 0)
);

console.log(sums);

答案 1 :(得分:2)

const list = [
  [2, 9, 1, 2],
  [2, 3, 9, 4],
  [4, 7, 8, 1]
];

let result = list.reduce( (a,b) => a.map( (c,i) => c + b[i] ));

console.log(result);

更新:要求解释。

首先 reduce 将给定一个数组(数组),并希望将其 reduce 减小到单个值(一个数组)。为此,它将调用第一个箭头函数2次。第一次 a 将是 [2,9,1,2] b 将是 [2,3,9, 4] 。使用 a b ,第一个箭头功能将返回 a 地图。将 a 作为数组,它将返回一个数组,其中每个元素都添加到数组 b 的相应元素中。第一张地图的结果将为 [4,12,10,6] reduce 现在将使用 a (第一个地图结果) [4,12,10,6] 再次调用第一个箭头功能,然后 b (输入 [4,7,8,1] 的最终数组元素)。此箭头功能将执行与以前相同的操作:返回一个数组,其中每个 a 元素都添加到 b 的相应元素中。 地图将返回 [8,19,18,7] 。由于没有更多的输入元素, reduce 将返回该值(数组)。

答案 2 :(得分:1)

要获得预期的结果,请使用以下选项,并使用两个循环与forEach

const blockList = [[2, 9, 1, 2], [2, 3, 9, 4], [4, 7, 8, 1]];
const result = [];

blockList.forEach((v, index) =>
  v.forEach((val, i) => {
    result[i] = result[i] ? result[i] : 0;
    result[i] += val;
  })
);

console.log(result);

codepen-https://codepen.io/nagasai/pen/yZRrKy?editors=1010

答案 3 :(得分:1)

您可以使用reduceforEach

在这里,我们创建一个带有索引的数组,然后将特定的元素添加到特定的索引中。而不仅仅是从对象中取出值。

const list = [[2, 9, 1, 2],[2, 3, 9, 4],[4, 7, 8, 1]]

let op = list.reduce((op,inp)=>{
   inp.forEach((e,i)=>op[i] = op[i] ? op[i]+e : e)
   return op
},[])

console.log(op)

答案 4 :(得分:-1)

使用嵌套循环:

const blocklist = [[2,9,1,2], [2,3,9,4], [4,7,8,1]], calculatedBlocks = [];
for (let j = 0, sum = 0; j < blocklist[0].length; j++, sum = 0) {
  for (let i = 0; i < blocklist.length; i++) sum += blocklist[i][j];
  calculatedBlocks.push(sum);
}

console.log(calculatedBlocks);

答案 5 :(得分:-1)

您可以将.reduce与迭代for...of循环结合使用,该循环使用v.entries提取每个内部数组的索引和值。然后只需按索引将它们分配给累加器数组,然后将它们加在一起即可。

let expectedResult = list.reduce((a,v) => {
 for(let [i, n] of v.entries()) a[i] = (a[i] || 0) + n
 return a;
}, []);

const list = [
  [2, 9, 1, 2],
  [2, 3, 9, 4],
  [4, 7, 8, 1]
]

let expectedResult = list.reduce((a,v) => {
 for(let [i, n] of v.entries()) a[i] = (a[i] || 0) + n
 return a;
}, []);

console.log(expectedResult);