web-dev-qa-db-fra.com

Javascript - Somme deux tableaux en une seule itération

Je veux additionner chaque valeur d'un tableau de nombres avec sa valeur correspondante dans un tableau de nombres différent, et je veux le faire sans avoir à parcourir chaque valeur individuellement.
Alors:

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

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

Mais j'aimerais bien le faire d'un seul coup, au lieu de faire ceci:

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

Quelqu'un peut-il penser à un moyen? Je suis assez perplexe.

21
TheNovice

Je sais que c'est une vieille question, mais j'en discutais avec quelqu'un et nous avons proposé une autre solution. Vous avez toujours besoin d'une boucle, mais vous pouvez le faire avec 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]
41
twalters
var arr = [1,2,3,4];
var arr2 = [1,1,1,2];

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

console.log(squares);
8
Dang Cong Duong

Il suffit de fusionner la réponse de Popovich et celle de 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]
3
Linmon

Vous ne pouvez pas éviter la boucle, mais vous pouvez le faire une fois et ajouter une fonction à tous les objets Array à l'aide de Array.prototype.

Voici et exemple:

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

Voici votre Fiddle .

3
Amir Popovich

L'exemple ci-dessous fonctionnera même avec des variations de longueur et quelques cas d'utilisation supplémentaires. check-out. vous pouvez aussi faire du prototypage si vous en aviez besoin.

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

1
Venkat.R

Vous pouvez utiliser la méthode _.unzipWith de la bibliothèque 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>

1
Yi-Ting Liu

Vous pouvez le faire en utilisant un style fonctionnel:

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)
0
rlib

Cet exemple fonctionnera avec une variation de longueur différente:

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)
}
0
Roman Volyanskiy