2013-11-01 42 views
0

循環修改數組是否安全?如推送元素?循環修改數組是否安全?

我使用的是強調每一種方法

+3

請顯示驗證碼。 – jfriend00

+1

通常不會,但是查看代碼片段會有所幫助,以便我們可以確定用例的確切答案。 –

+1

對Underscore沒有把握,但是通常情況下,提供迭代方法的庫往往會緩存數組的長度,因此如果在迭代過程中添加或刪除元素,就會感到困惑。但是用傳統的循環替代並自己管理索引變量並不難。 – nnnnnn

回答

1

我建議避免each,除非您絕對需要爲集合中的每個項目引發副作用(觸發事件,打印結果等)。爲了簡單地修改你的收藏,有更好的方法。

如果每個添加元素僅僅是一個單獨的輸入元件的結果,典型的功能性圖案。將flatmap陣列,它可以被認爲是一個兩個步驟:

  1. 使用map施加函數爲每個元素生成一個數組作爲結果。總體結果將是一個數組數組。
  2. 在該數組數組上使用flatten來獲得一維數組。

使用underscorelodash

var origArray = [1, 2, 3, 4]; 
var duplicateIf3 = function (val) { return val === 3 ? [val, val] : val; }; 
_.flatten(origArray.map(duplicateIf3)); 
// -> [1, 2, 3, 3, 4] 

(在類型化FP,該功能將不得不返回[val]對於不是3的值,但flatten並不關心 - 它變平不管你給它一個維度。)

如果新元素依賴於它之前的所有元素,那麼可能會使用reducefold,而將空數組作爲初始值。

var origArray = [1, 2, 3, 4]; 
origArray.reduce(function (acc, val) { return acc.concat(acc).concat(val); }, []); 
// -> [1, 1, 2, 1, 1, 2, 3, 1, 1, 2, 1, 1, 2, 3, 4] 

(抱歉,我不能想到一個現實的例子,但這裏的每一個步驟使用的用於說明目的相當簡單的方式,所有前面的步驟全力輸出,並且可以從原來的每個值見陣列發生了什麼事情。另外請注意,你可以從reduce使自己flatten,如果你不想使用下劃線/ lodash)

reduceflatmap比較一般,但是這兩種方法都能夠數組轉換成一個更大的陣列,一些如何依賴於第一個。

如果您有興趣瞭解更多信息,我強烈建議您查看Reg Braithwaite提供的免費(在線)Javascript Allongé

1

我不知道你的安全的意思,但你必須有很好的理由這樣做。我打得四處這一點,這是我的了:

_.each(a, function(el) { 
    if (el % 2 == 0) 
     a.push(el + 1); 
    console.log(el); 
}); 

// logs 1, 2, 3, 4, 5 

console.log(a); 
// logs [ 1, 2, 3, 4, 5, 3, 5 ] 

在這種情況下,有沒有負面影響,除非你只想通過添加的元素,但是你會發現自己在棘手的情況下,如果你'改變特定元素:

_.each(a, function(el, index) { 
    a[index + 1] = el - 1; 
    if (el % 2 == 0) 
     a.push(el + 1); 
    console.log(el); 
}); 

// logs 1, 0, -1, -2, -3 

在大多數使用情況下使用_.map會更有意義。

+1

可以肯定的是,這對於.splice()來說並不安全。 – nrabinowitz

相關問題