Javascript - суммирование двух массивов в одной итерации

Я хочу суммировать каждое значение массива чисел с его соответствующим значением в другом массиве чисел, и я хочу сделать это, не перебирая каждое отдельное значение.
Итак:

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

Может ли кто-нибудь подумать об этом? Я очень озадачен.

Ответ 1

Я знаю, что это старый вопрос, но я просто обсуждал это с кем-то, и мы придумали другое решение. Вам все еще нужен цикл, но вы можете выполнить это с помощью 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]

Ответ 2

var arr = [1,2,3,4];
var arr2 = [1,1,1,2];

var squares = arr.map((a, i) => a + arr2[i]);

console.log(squares);

Ответ 3

Вы не можете избежать цикла, но вы можете сделать это один раз и добавить функцию ко всем объектам Array с помощью Array.prototype.

Здесь и пример:

// 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 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.

Ответ 4

Просто слейте Поповича и 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]

Ответ 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) );

Ответ 6

Вы можете использовать метод _.unzipWith из библиотеки Lodash.

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

Ответ 7

Вот общее решение для 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

Ответ 8

Еще один способ сделать это может быть так

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]

Ответ 9

Вы можете сделать это с помощью некоторого функционального стиля:

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)

Ответ 10

Этот пример будет работать с разным изменением длины:

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