【问题标题】:Sum two arrays in single iteration在单次迭代中对两个数组求和
【发布时间】:2014-07-28 11:16:24
【问题描述】:

我想将数字数组的每个值与其在不同数字数组中的对应值相加,并且我想在不遍历每个单独值的情况下执行此操作。

所以:

var array1 = [1,2,3,4];
var array2 = [5,6,7,8];

var sum    = [6,8,10,12];

我很想一口气完成,而不是这样做:

for(var i = 0; i < array1.length; i++){
   sum.push(array1[i] + array2[i]);
}

谁能想到办法?我很困惑。

【问题讨论】:

标签: javascript arrays loops


【解决方案1】:

你无法避免循环,但你可以这样做一次,然后使用Array.prototype向所有 Array 对象添加一个函数。

下面是例子:

// Add a SumArray method to all arrays by expanding the Array prototype(do this once in a general place)
Array.prototype.SumArray = function (arr) {
    var sum = [];
    if (arr != null && this.length == arr.length) {
        for (var i = 0; i < arr.length; i++) {
            sum.push(this[i] + arr[i]);
        }
    }

    return sum;
}

// here's your code
var array1 = [1, 2, 3, 4];
var array2 = [5, 6, 7, 8];
var sum = array1.SumArray(array2);
console.log(sum); // [6,8,10,12]

这是你的Fiddle

【解决方案2】:

我知道这是一个老问题,但我只是在和某人讨论这个问题,我们想出了另一个解决方案。你仍然需要一个循环,但你可以使用 Array.prototype.map() 来完成。

var array1 = [1,2,3,4];
var array2 = [5,6,7,8];

var sum = array1.map(function (num, idx) {
  return num + array2[idx];
}); // [6,8,10,12]

【讨论】:

  • 好吧,如果 array1 num 重复呢?
  • @VladMiller 这是一个很好的观点。当时我没有意识到 JavaScript 的 map() 方法实际上也可以让你访问索引来解决这个问题。我更新了代码以反映这一点。
  • 如果需要对3个以上的数组求和怎么办?
  • 如果我有 var array1 = [1,2,3,4,5] &amp; array2 = [5,6,7,8].. 那么最后一个整数 5 不会打印。我该怎么办
【解决方案3】:

只需合并 Popovich 和 twalters 的答案。

Array.prototype.SumArray = function (arr) {

        var sum = this.map(function (num, idx) {
          return num + arr[idx];
        });

        return sum;
    }
var array1 = [1,2,3,4];
var array2 = [5,6,7,8];
var sum = array1.SumArray(array2);
console.log(sum); // [6,8,10,12]

【讨论】:

    【解决方案4】:
    var arr = [1,2,3,4];
    var arr2 = [1,1,1,2];
    
    var squares = arr.map((a, i) => a + arr2[i]);
    
    console.log(squares);
    

    【讨论】:

    • 如何将两个数组嵌套为另一个数组的索引?像这样... [[5, 2, 3], [2, 2, 3, 10, 6] ]
    • 这与接受的答案完全相同
    【解决方案5】:

    以下示例即使在长度变化和更多用例的情况下也能正常工作。退房。如果需要,您也可以进行原型设计。

    function sumArray(a, b) {
          var c = [];
          for (var i = 0; i < Math.max(a.length, b.length); i++) {
            c.push((a[i] || 0) + (b[i] || 0));
          }
          return c;
    }
    
    // First Use Case.
    var a = [1, 2, 3, 4];
    var b = [1, 2, 3, 4];
    console.log( sumArray(a, b) );
    
    // Second Use Case with different Length.
    var a = [1, 2, 3, 4];
    var b = [1, 2, 3, 4, 5];
    console.log( sumArray(a, b) );
    
    // Third Use Case with undefined values and invalid length.
    var a = [1, 2, 3, 4];
    var b = [];
    b[1] = 2;
    b[3] = 4;
    b[9] = 9;
    console.log( sumArray(a, b) );

    【讨论】:

    • 现在 sn-ps 提供了一个内置的控制台。无需设置 HTML。
    • 你的第二个用例不能正常工作。给我这个结果{1: 1, 10: 2, 11: 3, 20: 1, 25: 3, 30: 2} 1: 1 10: 2 11: 3 20: 1 25: 3 30: 2
    • 看你的意见
    【解决方案6】:

    您可以使用一些函数式样式来做到这一点:

    const a = [1,2,3]
    const b = [4,5,6]
    
    const f= a.concat(b).map((v,i,arr)=>{
      if ( i<arr.length) return v+arr[i+arr.length/2]
    }).filter(n=>!isNaN(n))
    
    console.log(f)
    

    【讨论】:

      【解决方案7】:

      您可以使用 Lodash 库中的 _.unzipWith 方法。

      var array1 = [1, 2, 3, 4];
      var array2 = [5, 6, 7, 8];
      var array = [array1, array2];
      console.log(_.unzipWith(array, _.add));
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"&gt;&lt;/script&gt;

      【讨论】:

        【解决方案8】:

        这个例子适用于不同的长度变化:

        let getSum = (arr1, arr2) =>  {
           let main = arr1.length >= arr2.length ? arr1 : arr2;
           let sec = arr1.length < arr2.length ? arr1 : arr2;
           return main.map((elem, i) => sec[i] ? elem + sec[i] : elem)
        }
        

        【讨论】:

          【解决方案9】:

          这里是 N 个可能不同长度的数组的通用解决方案。

          它使用Array.prototype.reduce()Array.prototype.map()Math.max()Array.from()

          function sumArrays(...arrays) {
            const n = arrays.reduce((max, xs) => Math.max(max, xs.length), 0);
            const result = Array.from({ length: n });
            return result.map((_, i) => arrays.map(xs => xs[i] || 0).reduce((sum, x) => sum + x, 0));
          }
          
          console.log(...sumArrays([0, 1, 2], [1, 2, 3, 4], [1, 2])); // 2 5 5 4

          【讨论】:

            【解决方案10】:

            另一种方法可能是这样的

            var array1 = [1,2,3,4];
            var array2 = [5,6,7,8];
            
            var sum = [...array1].map((e,i)=> e+array2[i]); //[6,8,10,12]
            

            在这种情况下[...array1][1,2,3,4] 相同

            【讨论】:

              【解决方案11】:

              在一行中使用函数式编程对可能不同长度的 N 个数组的通用解决方案;)

              const sumArrays = as => as.filter(a => a.length).length ? [as.filter(a => a.length).reduce((r, a) => r + a.shift(), 0), ...sumArrays(as)] : [] console.log(sumArrays([[1, 2, 3], [100], [11, 22, 33, 44], []]))

              【讨论】:

                【解决方案12】:

                在 ES6+ 中,您可以使用 arrow function 使代码清晰:

                var x = [1,2,3];
                var y = [2,3,4];
                var sum = x.map( (val, i) => val + y[i] );
                
                console.log(sum); //Array [3, 5, 7]
                
                
                var z = [3,4,5];
                var add3 = x.map( (val, i) => val + y[i] + z[i] );
                
                console.log(add3); //Array [6, 9, 12]
                

                【讨论】:

                  【解决方案13】:

                  以上所有答案都是正确的,

                  使用reduce。我只是想添加我的答案可能简单而有用。

                  var array1 = [1,2,3,4];
                  var array2 = [5,6,7,8];
                  
                  const reducer = (accumulator, currentValue, index, array) => {
                      let val = currentValue + array2[index];
                      accumulator.push(val);
                      return accumulator;
                  }
                  
                  
                  console.log(array1.reduce(reducer, []));

                  谢谢..

                  【讨论】:

                    【解决方案14】:

                    对于遇到这个问题的所有初学者,他们可能不具备使用 map/reduce 或三元运算符的水平..

                     let sum = 0;
                     let nums = []
                    
                     for (let i = 0; i < array1.length; i++){
                         sum = array1[i] + array2[i];
                         nums.push(sum)
                       }
                    
                     return nums
                    

                    【讨论】:

                    • 欢迎来到 Stack Overflow!不错的答案!您应该考虑使用registering an account 来访问 Stack Overflow 的更多功能。
                    猜你喜欢
                    • 2017-07-12
                    • 2011-02-17
                    • 1970-01-01
                    • 2012-08-10
                    • 1970-01-01
                    • 2020-10-23
                    • 1970-01-01
                    • 2013-08-04
                    • 2021-04-25
                    相关资源
                    最近更新 更多