JavaScript数组方法的错误使用例子
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')); // 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是一个很有用的函数,它返回一个满足过滤条件的新数组。正如其名字表达的含义,它是用来做过滤的。
但是,如果我们知道我们要的结果只有一个元素的时候,我就不建议使用它了。比如,如果我们的回调函数定义用一个唯一的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是否是最佳的方案呢?可能不是,因为它返回的是元素具体的值,而不是布尔值。
我推荐大家使用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的时候,你是否觉察到需要点东西,对不?
我的意思是:我们对整个数组循环了2遍。第一次是过滤返回一个新的数组,第二次通过map又构造一个新的数组。我们使用了两个数组方法,每一个方法都有各自的回调函数,而且array.filter返回的数组以后再也不会用到。
为了避免低效率,我建议使用array.reduce。同样的结果,更优雅的代码!请看下面的例子:‘'
'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'] } // ]
推荐阅读
-
javascript对数组的常用操作代码 数组方法总汇_javascript技巧
-
对JavaScript数组的方法总结
-
判断一个变量是数组Array类型的方法_javascript技巧
-
Javascript数组去重的几种方法
-
在JavaScript中使用对数Math.log()方法的教程
-
sp_executesql 使用复杂的Unicode 表达式错误的解决方法
-
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法,getdate数组
-
终于解决了IE8不支持数组的indexOf方法_javascript技巧
-
JavaScript使用300行代码解决汉字转拼音的方法详解
-
PHP数组与对象之间使用递归实现转换的方法