2013-02-27 74 views
8

我需要添加元素明智的幾個數組。也就是說,我有幾個等長的數組,而且我只需要一個具有相同數量元素的輸入總和。 Underscore有方法將所有元素合併爲一個元素,並使用一個函數映射每個元素,但我找不到任何方式將兩個數組合併成明智的方式。使用underscore.js將兩個(或更多)數組映射成一個

如果我的原始陣列是[1,2,3,4,5,6][1,1,1,1,1,1][2,2,2,2,2,2],結果應該是[4,5,6,7,8,9]

我知道我可以通過迭代數組來完成,但不知道使用underscore.js函數會更容易/更快。我可以做嗎?怎麼樣?

回答

10

更容易是,更快沒有。

var arrays = [[1,2,3,4,5,6], [1,1,1,1,1,1], [2,2,2,2,2,2]]; 

_.map(_.zip.apply(_, arrays), function(pieces) { 
    return _.reduce(pieces, function(m, p) {return m+p;}, 0); 
}); 
+0

這很完美。它適用於我所有的場景並且速度足夠快。我將以直接迭代爲基準,但看起來不錯。謝謝。 – 2013-02-27 10:08:46

+0

@Bergi我不明白'apply(_,'notation。什麼underscorejs函數是與_有關的? – 2013-10-16 12:06:12

+0

@StephaneRolland:'_'這裏是Underscore對象本身。檢查['fn.apply'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)對參數做了...實際上,我們也可以在這裏通過'null'。 – Bergi 2013-10-16 13:07:37

5

我不認爲用下劃線會更容易。這裏有兩種選擇:

var a = [1,2,3,4,5,6] 
    , b = [1,1,1,1,1,1] 
    , c = [2,2,2,2,2,2]; 

var result = a.map(function(_,i) { 
    return a[i] + b[i] + c[i]; 
}); 

// OR 

var result = []; 
for (var i = 0; i < a.length; i++) { 
    result.push(a[i] + b[i] + c[i]); 
} 

console.log(result); //=> [4,5,6,7,8,9] 
+1

第二個版本就是我現在使用的版本。唯一的問題是,雖然它對兩個或三個陣列可以正常工作,但在有更多的時候它在概念上受到限制。我最初的想法是構建一個數組的數組,並且 - 以某種方式 - 將它們全部映射爲元素。總之,你的第一個解決方案看起來很有前途我將嘗試擴展它。 – 2013-02-27 09:57:40

0

您可以結合使用ZIP地圖和減少: 未經測試,但這樣的事情可能會奏效

var result = _.map(_.zip(array1, array2, array3),function(zipped){return _.reduce(zipped, function(memo, num){ return memo + num; }, 0)}); 
+0

有一個第一個下劃線後丟失點:)。您的解決方案與Bergi寫的幾乎完全相同,但使用的是zip版本。 zip._apply不給我正確的答案。我需要回到文檔來找出原因。非常感謝。 – 2013-02-27 10:12:40

+0

我改正了這一點。 – benzonico 2013-02-27 12:24:09

3

爲了模擬zipWith,您可以用求和reduce結合了zip你可以使用lodash(https://lodash.com/)而不是下劃線,它有一個非常酷的zipWith(https://lodash.com/docs#zipWith)運算符,它可以像下面的例子那樣工作。 (注意_.add也是lodash數學函數)

var a = [1,2,3,4,5,6] 
    , b = [1,1,1,1,1,1] 
    , c = [2,2,2,2,2,2]; 

var result = _.zipWith(a, b, c, _.add); 

// result = [4, 5, 6, 7, 8, 9] 
相關問題