数値の配列の各値を、異なる数値の配列の対応する値と合計し、個々の値をループすることなくこれを実行したい。
そう:
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]);
}
誰もが方法を考えることができますか?私はかなり困惑しています。
これは古い質問であることは知っていますが、これを誰かと話し合っていたところ、別の解決策を思いつきました。まだループが必要ですが、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]
var arr = [1,2,3,4];
var arr2 = [1,1,1,2];
var squares = arr.map((a, i) => a + arr2[i]);
console.log(squares);
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]
ループを回避することはできませんが、これを一度行うと、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 です。
これは、長さが異なる可能性のある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
以下の例は、長さのばらつきがあり、ユースケースがさらに少ない場合でも機能します。チェックアウト。必要に応じてプロトタイプを作成することもできます。
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) );
_.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>
機能的なスタイルを使用してそれを行うことができます:
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)
この例は、さまざまな長さのバリエーションで機能します。
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)
}