1. 不要使用Array.indexOf,使用Array.includes
“如果你要在數組中查找元素,使用Array.indexOf!”。記得在我學習JavaScript課程時候,有這樣一句話。這句話沒錯,確實可以這么使用!
根據MDN文檔:“Array.indexOf會返回被查找元素第一個匹配的位置的下標。”因此,如果后面需要用到這個索引,Array.indexOf是一個很好的解法。但是,我們要解決的問題是:查找數組中是否包含某個元素。這是一個Yes/No的問題,是一個返回布爾類型的真假問題。因此,我建議使用Array.includes,它會返回一個布爾值。
'use strict';const characters = [ 'ironman', 'black_widow', 'hulk', 'captain_america', 'hulk', 'thor',];console.log(characters.indexOf('hulk'));// 2console.log(characters.indexOf('batman'));// -1console.log(characters.includes('hulk'));// trueconsole.log(characters.includes('batman'));// false2. 不要使用Array.filter,使用Array.find
Array.filter是一個很有用的函數,它返回一個滿足過濾條件的新數組。正如其名字表達的含義,它是用來做過濾的。
但是,如果我們知道我們要的結果只有一個元素的時候,我就不建議使用它了。比如,如果我們的回調函數定義用一個唯一的ID來過濾,那么結果必然唯一了。在這個情況下,Array.filter會返回只有一個元素的數組。因為既然能通過一個特定的ID來查找,我們已經確定只有一個元素了,那么使用數組就沒有意義。
另外,我們再來聊聊性能問題。為了返回所有匹配的元素,Array.filter需要查找整個數組。可以想象一下,如果有上百個元素滿足過濾條件,那么返回的數組就很大。
為了避免這樣的情況,我建議使用Array.find。它僅僅返回第一個滿足過濾條件的元素。而且,Array.find會在查找到第一個滿足條件的元素后就結束執行,而不會查找整個數組。
'use strict';const characters = [ { id: 1, name: 'ironman' }, { id: 2, name: 'black_widow' }, { id: 3, name: 'captain_america' }, { id: 4, name: 'captain_america' },];function getCharacter(name) { return character => character.name === name;}console.log(characters.filter(getCharacter('captain_america')));// [//  { id: 3, name: 'captain_america' },//  { id: 4, name: 'captain_america' },// ]console.log(characters.find(getCharacter('captain_america')));// { id: 3, name: 'captain_america' }3. 不要使用Array.find,使用Array.some
我承認我犯過很多次錯誤。后來,一個很要好的朋友讓我去看看MDN的文檔,說有更好的解決方案。這個情況和剛剛提到的Array.indexOf/Array.includes很像。
在前面的例子中,我們看到Array.find接受一個過濾函數,返回滿足的元素。那么,如果我們要查找一個數組是否包含某個元素的時候,Array.find是否是最佳的方案呢?可能不是,因為它返回的是元素具體的值,而不是布爾值。
新聞熱點
疑難解答
圖片精選