2016-06-19 11 views
1

answerJavascript equivalent of Python's zip functionは、任意の数の配列を1つのステートメントでマージされた配列に「圧縮」するうまい方法を示しています。Javascript - 単一式の配列の可変数を合計する

zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c])) 

この質問Javascript - Sum two arrays in single iterationは、同様のアイデアを示しているが、彼らはzip形式で圧縮しているとして、エントリを合計します。

私は2つの手法を組み合わせる方法を思ったんだけど - その配列の数が不明与えられた:

[ 
    [1,2,3], 
    [1,2,3], 
    [1,2,3] 
] 

...結果はそう秒と、最初の要素の合計すなわち、[3, 6, 9]です。簡単にするために、各配列に同じ数の項目が含まれていると仮定します。

答えて

1

、それだけで非常に複雑である必要はありません。

numbers = [[1,2,3],[1,2,3],[1,2,3]]; 
 

 
var result = numbers[0].map(function(_, i) { 
 
    return numbers.reduce(function(prev, row) { 
 
    return row[i] + prev; 
 
    }, 0); 
 
}); 
 

 
console.log(result);

0

最初に列を転置すると、列が行となり、その逆になります。その後、単にreduce関数を呼び出します。

コードの最初のバージョンは、簡潔にするために、ほとんどがタイスクリプトです。 2番目のバージョンはJavaScriptです。

ES5 mapおよびreduceは、IE9以上でのみ使用できます。

var numbers = [[1,2,3],[1,2,3],[1,2,3]] 
 

 
// TypeScript 
 

 
var colSums = numbers[0].map(function(col, i) { 
 
    return numbers.map((row) => row[i]).reduce((a,b) => a + b); 
 
}); 
 

 
// JavaScript 
 

 
/*var colSums = numbers[0].map(function(col, i) { 
 
    return numbers.map(function(row) { 
 
    return row[i]; 
 
    }).reduce(function(a,b) { 
 
    return a + b; 
 
    }); 
 
});*/ 
 
document.getElementById("col-sums").innerHTML = colSums;
<p id="col-sums"></p>

+0

たちは同じ考えを持っていたように見える - あなたはES5互換性があります(マッピングし、利用可能な削減以来、IE9) –

0

私はそれを持っていると思う - このanswerは役に立ちました - 私たちは、このように、元のビュン方法を拡張することができません:、

zip = rows => rows[0].map((_,c) => rows.map(row=>row[c]).reduce((a,b) => a+b,0)) 
0

マップ、マップの不要を減らす、2地図はそこにあなたを連れて行きます:

Quick Demo

他の回答と同様に
var m = [ 
    [1,2,3], 
    [1,2,3], 
    [1,2,3] 
]; 

var total = m.map(function(arr, i) { 
    var count = 0; 
    return arr.map(function(el, idx) { 
    return count += m[idx][i]; 
    }) 
}).pop() 
+0

申し訳ありません、それはちょうど最初の2つを追加するつもりです[2,4,6]の結果! –

+0

良いキャッチ編集。これにアプローチする方法はたくさんあります – JordanHendrix

関連する問題