1. 不要使用Array.indexOf,使用Array.includes
“如果你要在數(shù)組中查找元素,使用Array.indexOf!”。記得在我學(xué)習(xí)JavaScript課程時(shí)候,有這樣一句話。這句話沒錯(cuò),確實(shí)可以這么使用!
根據(jù)MDN文檔:“Array.indexOf會返回被查找元素第一個(gè)匹配的位置的下標(biāo)。”因此,如果后面需要用到這個(gè)索引,Array.indexOf是一個(gè)很好的解法。但是,我們要解決的問題是:查找數(shù)組中是否包含某個(gè)元素。這是一個(gè)Yes/No的問題,是一個(gè)返回布爾類型的真假問題。因此,我建議使用Array.includes,它會返回一個(gè)布爾值。
'use strict'; const characters = [ 'ironman', 'black_widow', 'hulk', 'captain_america', 'hulk', 'thor', ]; console.log(characters.indexOf('hulk')); // 2 console.log(characters.indexOf('batman')); // -1 console.log(characters.includes('hulk')); // true console.log(characters.includes('batman')); // false
2. 不要使用Array.filter,使用Array.find
Array.filter是一個(gè)很有用的函數(shù),它返回一個(gè)滿足過濾條件的新數(shù)組。正如其名字表達(dá)的含義,它是用來做過濾的。
但是,如果我們知道我們要的結(jié)果只有一個(gè)元素的時(shí)候,我就不建議使用它了。比如,如果我們的回調(diào)函數(shù)定義用一個(gè)唯一的ID來過濾,那么結(jié)果必然唯一了。在這個(gè)情況下,Array.filter會返回只有一個(gè)元素的數(shù)組。因?yàn)榧热荒芡ㄟ^一個(gè)特定的ID來查找,我們已經(jīng)確定只有一個(gè)元素了,那么使用數(shù)組就沒有意義。
另外,我們再來聊聊性能問題。為了返回所有匹配的元素,Array.filter需要查找整個(gè)數(shù)組。可以想象一下,如果有上百個(gè)元素滿足過濾條件,那么返回的數(shù)組就很大。
為了避免這樣的情況,我建議使用Array.find。它僅僅返回第一個(gè)滿足過濾條件的元素。而且,Array.find會在查找到第一個(gè)滿足條件的元素后就結(jié)束執(zhí)行,而不會查找整個(gè)數(shù)組。
'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
我承認(rèn)我犯過很多次錯(cuò)誤。后來,一個(gè)很要好的朋友讓我去看看MDN的文檔,說有更好的解決方案。這個(gè)情況和剛剛提到的Array.indexOf/Array.includes很像。
在前面的例子中,我們看到Array.find接受一個(gè)過濾函數(shù),返回滿足的元素。那么,如果我們要查找一個(gè)數(shù)組是否包含某個(gè)元素的時(shí)候,Array.find是否是最佳的方案呢?可能不是,因?yàn)樗祷氐氖窃鼐唧w的值,而不是布爾值。
我推薦大家使用Array.some,它會返回布爾值。
'use strict'; const characters = [ { id: 1, name: 'ironman', env: 'marvel' }, { id: 2, name: 'black_widow', env: 'marvel' }, { id: 3, name: 'wonder_woman', env: 'dc_comics' }, ]; function hasCharacterFrom(env) { return character => character.env === env; } console.log(characters.find(hasCharacterFrom('marvel'))); // { id: 1, name: 'ironman', env: 'marvel' } console.log(characters.some(hasCharacterFrom('marvel'))); // true
4. 不要使用Array.map和Array.filter組合,使用Array.reduce
Array.reduce有點(diǎn)難以理解!但是,如果我們每次在同時(shí)使用Array.filter和Array.map的時(shí)候,你是否覺察到需要點(diǎn)東西,對不?
我的意思是:我們對整個(gè)數(shù)組循環(huán)了2遍。第一次是過濾返回一個(gè)新的數(shù)組,第二次通過map又構(gòu)造一個(gè)新的數(shù)組。我們使用了兩個(gè)數(shù)組方法,每一個(gè)方法都有各自的回調(diào)函數(shù),而且Array.filter返回的數(shù)組以后再也不會用到。
為了避免低效率,我建議使用Array.reduce。同樣的結(jié)果,更優(yōu)雅的代碼!請看下面的例子:‘'
'use strict'; const characters = [ { name: 'ironman', env: 'marvel' }, { name: 'black_widow', env: 'marvel' }, { name: 'wonder_woman', env: 'dc_comics' }, ]; console.log( characters .filter(character => character.env === 'marvel') .map(character => Object.assign({}, character, { alsoSeenIn: ['Avengers'] })) ); // [ // { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] }, // { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] } // ] console.log( characters .reduce((acc, character) => { return character.env === 'marvel' ? acc.concat(Object.assign({}, character, { alsoSeenIn: ['Avengers'] })) : acc; }, []) ) // [ // { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] }, // { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] } // ]
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com