2017-06-13 97 views
2

我有一個數組,它被引用作爲模型綁定(to handsontable)。我們稱之爲data。在某些時候,我需要重新從頭開始重新計算(我們稱之爲新陣列freshData;它可能有不同的長度)。分配data = freshData不會完成這項工作,因爲這隻會改變data引用的內容,並且不會更改綁定模型。但調用的data.splice.push這項工作:通過引用重新填充數組的最簡單方法是什麼?

data.splice(0,data.length); 
for(var i = 0; i < freshData.length; i++) 
    data.push(freshData[i]); 

我在想:這能在更短的方式進行?就像沒有循環,甚至可能使用單一方法? data.concat(freshData)沒有幫助,因爲它創建了一個新的陣列,它本身不會改變data。此外,該迭代看起來在性能方面有所欠佳......

回答

2

如果你有ES2015支持或巴貝爾:

data.push(...freshData)

否則只是去與

data.push.apply(data, freshData);

2

可以使用splice作爲oneliner

data.splice(0, data.length, ...freshData); 

或者,使用data.length = 0清空數組,然後放入新的數據,無論是使用循環或傳遞多個參數來push。請注意,使用spread syntaxapply可能會導致調用堆棧數組過大。

或者做硬盤的方式與分配:

for (var i=0; i<freshData.length; i++) 
    data[i] = freshData[i]; 
data.length = i; 

這個迭代看起來在性能方面有所欠佳......

沒有,總是有一個需要在一些迭代方式或其他。時間複雜度將與舊數據和新數據的大小成線性關係。但表現shouldn't be your first concern,注重可讀性和正確性。如果它實際上是一個緊張的地方,那麼確定你自己的比較基準。我懷疑我的任務解決方案是最快的,因爲它不會執行方法調用,並且在可能的情況下往往會避免數組大小調整。

+0

謝謝,單行是非常好的,但我可能會使用enapupe提出的老式版本'data.push.apply(data,freshData)'。說到性能:所以在JS中,我們不能更改對新陣列的引用,對吧? (當被問及避免迭代時,這就是我想到的) – YakovL

+1

是的,沒錯。我們只能改變屬性引用,但是你的'data'是一個變量。 – Bergi

相關問題