【问题标题】:How to accumulate and sum values from two arrays?如何对两个数组的值进行累加和求和?
【发布时间】:2019-01-24 16:35:46
【问题描述】:

我有 2 个数组(数组 2 是多维的),如下所示:

Array 1 = 
 [1795, 3449, 41, 1261, 99, 38162, 36, 7, 2768, 53, 1800]

Array 2 = 
 [[33, 0, 0, 433, 17, 2388, 0, 0, 0, 0, 0],
 [508, 0, 0, 242, 36, 800,  0, 0, 5, 0, 0],
 [285, 0, 0, 0,   0,  1600, 0, 0, 0, 0, 0], 
 [0,   0, 0, 0,   0,  1700, 0, 0, 0, 0, 0], 
 [0,   0, 0, 0,   0,  0,    0, 0, 0, 0, 0]]

数组的长度总是相同的。

我要做的是累积每个数组位置的值,所以它们应该是这样的:

[[1795, 3449, 41, 1261, 99,  38162, 36, 7, 2768]
[1828, 3449, 41, 1694, 116, 40550, 36, 7, 2768]
[2336, 3449, 41, 1936, 152, 41350, 36, 7, 2773]
[2621, 3449, 41, 1936, 152, 42950, 36, 7, 2773]
[2621, 3449, 41, 1936, 152, 44650, 36, 7, 2773]
[2621, 3449, 41, 1936, 152, 44650, 36, 7, 2773]]

最终的数组会取上一行的值并向下累加。

我尝试过使用 map 和 reduce,但我认为因为数组 2 是多维的,而且我还是 JS 的新手,所以我无法让它工作。任何帮助,将不胜感激。

这是我已经尝试过的:

var yearSums = array1.map(function (array1Map) {
    return [parseInt(array1Map) + parseInt(array2)]
})

这给了我这个:

[1828.0, 3482.0, 74.0, 1294.0, 132.0, 38195.0, 69.0, 40.0, 2801.0, 86.0, 1833.0]

它的作用是将数组 2 中的第一个元素 (33) 添加到数组 1 中的每个值中。

【问题讨论】:

  • 您实际上尝试过什么来实现这一目标?添加您的代码。
  • 那么...第一行被array1替换了吗?
  • @Ruben Apps-script 标签表示 ES3 语法。
  • AFAIK 标签应源自问题/相关答案内容。该线程中没有一个提到特定的 JavaScript 版本或相关平台。是什么让您认为 google-apps-script 应该包含在这个问题中?您是否注意到在我编辑之前已经使用箭头功能给出了答案?顺便说一句,我们有ecmascript-3
  • @Ruben 谢谢你的回复。尽管问题本身没有明确提及,但我相信 OP 包含该标签是为了让我们知道这是 Google-apps-script。 Tour 页面确实说 All questions are tagged with their subject areas。如果 OP 认为它是一个主题领域,并且该标签与手头的问题并非无关,我认为不应该根据答案的内容将其删除。

标签: javascript multidimensional-array google-apps-script google-sheets


【解决方案1】:

我们也可以使用 Array.reduce 来达到同样的效果。

var arr1 = [1795, 3449, 41, 1261, 99, 38162, 36, 7, 2768, 53, 1800];
var arr2 = [
  [33, 0, 0, 433, 17, 2388, 0, 0, 0, 0, 0],
  [508, 0, 0, 242, 36, 800, 0, 0, 5, 0, 0],
  [285, 0, 0, 0, 0, 1600, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 1700, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
];
var sumArr = arr2.reduce(
  function(acc, curr) {
    acc.push(
      acc[acc.length - 1].map(function(col, idx) {
        return col + curr[idx];
      })
    );
    return acc;
  },
  [arr1] //Initialize Array1 as a 2D array.
);
console.log(sumArr);

【讨论】:

    【解决方案2】:

    使用第一个数组(我们称之为acc)作为累加器,同时以嵌套方式映射嵌套数组(table):

     const result = table.map(row => row.map((value, index) => acc[index] += value));
    

    这会改变第一个数组,如果你需要不变性,可以克隆它。

    【讨论】:

    • 问题的标签包括google-apps-script。假设 OP 的目的是为问题添加上下文,那么您提出的解决方案不能用作 Google Apps 脚本不支持箭头函数。
    【解决方案3】:

    仅适用于相同长度的数组。

    您必须在每个数组内循环,以获取每个数组索引的值并将它们相加。

    更新

    第一次没有得到你所期望的。更新脚本

    var array1 = 
     [1795, 3449, 41, 1261, 99, 38162, 36, 7, 2768, 53, 1800]
    
    var array2 = 
     [[33, 0, 0, 433, 17, 2388, 0, 0, 0, 0, 0],
     [508, 0, 0, 242, 36, 800,  0, 0, 5, 0, 0],
     [285, 0, 0, 0,   0,  1600, 0, 0, 0, 0, 0], 
     [0,   0, 0, 0,   0,  1700, 0, 0, 0, 0, 0], 
     [0,   0, 0, 0,   0,  0,    0, 0, 0, 0, 0]]
    
    var summedArray = array2.map(arr => arr.map((subArr,i) => subArr +array1[i])) 
    
    console.log(summedArray)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      相关资源
      最近更新 更多