2016-06-19 17 views
1

answerJavascript equivalent of Python's zip function顯示了一種整齊的方式來獲取任意數量的數組,並將它們「壓縮」到單個語句中的合併數組中。Javascript - zip和單個表達式中的可變數組總數

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

這個問題Javascript - Sum two arrays in single iteration顯示了類似的想法,但他們拉上項相加。

我不知道如何將兩種技術結合起來 - 所以給出一個未知數量的陣列:

[ 
    [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

首先轉置數組,所以列變成行並且viceaversa。之後,只需撥打reduce函數即可。

爲了簡潔起見,代碼的第一個版本大多是打字稿。第二個版本是JavaScript。

請注意,ES5 mapreduce功能僅適用於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

無需地圖,地圖,減少兩地圖會讓你到那裏:

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,4,6]! –

+0

好抓,編輯。很多方法來解決這個問題 – JordanHendrix

相關問題