最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript數(shù)組方法的錯誤使用例子

 更新時間:2018年09月13日 08:41:25   投稿:laozhang  
在本篇文章中我們給大家分享了幾種使用JavaScript數(shù)組容易出錯的例子,需要的朋友們可以參考下。

1. 不要使用Array.indexOf,使用Array.includes

“如果你要在數(shù)組中查找元素,使用Array.indexOf!”。記得在我學(xué)習(xí)JavaScript課程時候,有這樣一句話。這句話沒錯,確實可以這么使用!

根據(jù)MDN文檔:“Array.indexOf會返回被查找元素第一個匹配的位置的下標(biāo)。”因此,如果后面需要用到這個索引,Array.indexOf是一個很好的解法。但是,我們要解決的問題是:查找數(shù)組中是否包含某個元素。這是一個Yes/No的問題,是一個返回布爾類型的真假問題。因此,我建議使用Array.includes,它會返回一個布爾值。

'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是一個很有用的函數(shù),它返回一個滿足過濾條件的新數(shù)組。正如其名字表達(dá)的含義,它是用來做過濾的。

但是,如果我們知道我們要的結(jié)果只有一個元素的時候,我就不建議使用它了。比如,如果我們的回調(diào)函數(shù)定義用一個唯一的ID來過濾,那么結(jié)果必然唯一了。在這個情況下,Array.filter會返回只有一個元素的數(shù)組。因為既然能通過一個特定的ID來查找,我們已經(jīng)確定只有一個元素了,那么使用數(shù)組就沒有意義。

另外,我們再來聊聊性能問題。為了返回所有匹配的元素,Array.filter需要查找整個數(shù)組??梢韵胂笠幌?,如果有上百個元素滿足過濾條件,那么返回的數(shù)組就很大。

為了避免這樣的情況,我建議使用Array.find。它僅僅返回第一個滿足過濾條件的元素。而且,Array.find會在查找到第一個滿足條件的元素后就結(jié)束執(zhí)行,而不會查找整個數(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)我犯過很多次錯誤。后來,一個很要好的朋友讓我去看看MDN的文檔,說有更好的解決方案。這個情況和剛剛提到的Array.indexOf/Array.includes很像。

在前面的例子中,我們看到Array.find接受一個過濾函數(shù),返回滿足的元素。那么,如果我們要查找一個數(shù)組是否包含某個元素的時候,Array.find是否是最佳的方案呢?可能不是,因為它返回的是元素具體的值,而不是布爾值。

我推薦大家使用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有點難以理解!但是,如果我們每次在同時使用Array.filter和Array.map的時候,你是否覺察到需要點東西,對不?

我的意思是:我們對整個數(shù)組循環(huán)了2遍。第一次是過濾返回一個新的數(shù)組,第二次通過map又構(gòu)造一個新的數(shù)組。我們使用了兩個數(shù)組方法,每一個方法都有各自的回調(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'] }
// ]

相關(guān)文章

最新評論

云梦县| 赤城县| 南宫市| 定结县| 济阳县| 泗水县| 丰城市| 出国| 沁水县| 宁波市| 宿迁市| 苗栗市| 武乡县| 桑日县| 上杭县| 安达市| 噶尔县| 大庆市| 宝鸡市| 庐江县| 榆中县| 日土县| 临海市| 玛多县| 东阳市| 岐山县| 舒兰市| 祁东县| 柘城县| 襄垣县| 会东县| 孟村| 丹棱县| 杭锦旗| 南靖县| 崇左市| 灵璧县| 蕲春县| 曲靖市| 永靖县| 济宁市|