2016-08-02 38 views
0

我在考慮如何最好地使用Immutable.js。我看到一些像這樣的代碼:我應該使用刪除和findIndex或過濾器從immutable.js列表中刪除項目嗎?

state.update('something', something => 
something.delete(
    something.findIndex(x => x.id === 1) 
) 
) 

而且在我看來,這樣的代碼可以使用過濾器來編寫更清潔:

state.update('something', something => 
something.filter(x => x.id !== 1) 
) 

,甚至可能會點免費電話:

propEq = k => v => x => x[k] === v 
state.update('something', propEq('x', 1)) 

這裏有什麼重大的性能折衷?

如果delete + findIndex明顯更具性能,那麼有沒有一種乾淨的,無點寫法的代碼?

回答

0

我喜歡你的過濾方法。我可能會調整到使用filterNot()謂詞,雖然這只是個人的品味比什麼都重要:

state.update('something', something => 
    something.filterNot(x => x.id === 1) 
) 

唯一PERF擔心的是,過濾意味着你必須遍歷整個列表,不管是什麼。對於較小的列表來說這不是什麼大問題,但是對於較大的列表,perf的降級可能是顯而易見的。

例如,在10,000個項目的列表中,findIndex()可能不會迭代10,000次,而filter()將始終迭代10,000次。

因此,如果filter()不適合您的應用程序數據,那麼我會堅持使用更簡潔的代碼,切換到findIndex()delete()

1

正如亞當所述,findIndex不會遍歷整個列表,但我的建議是使用地圖而不是列表,id是關鍵。然後,您的時間複雜度爲O(1),並且刪除條目也更清晰可讀。