JavaScript中Array方法你该知道的正确打开方法


Posted in Javascript onSeptember 11, 2018

前言

在过去的几个月,我发现我的拉取请求中存在四个完全相同的 JavaScript 错误。于是我写了这篇文章,总结了如何在 JavaScript 中正确使用地使用 Array 的方法!

Array对象为JavaScript内置对象,具有以下属性:

属性 描述
constructor 返回对创建此对象的数组函数的引用。
length 返回数组中元素的个数
prototype 向对象添加属性和方法。

用 Array.includes 代替 Array.indexOf

“如果你要在数组中查找元素,请使用 Array.indexOf”。我记得在学习 JavaScript 的时候,在教材中读到这样的一句话。毫无疑问,这句话是真的!

MDN 文档写道,Array.indexOf 将“返回第一次出现给定元素的索引”。因此,如果我们稍后要在代码中使用这个返回的索引,那么使用 Array.indexOf 找到索引就对了。

但是,如果我们只想知道数组是否包含某个值,该怎么办?这似乎是一个是与否的问题,或者说是一个布尔值问题。对于这种情况,我建议使用返回布尔值的 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

使用 Array.find 而不是 Array.filter

Array.filter 是一个非常有用的方法。它接受一个回调函数作为参数,基于一个包含所有元素的数组创建出一个新的数组。正如它的名字一样,我们使用这个方法来过滤元素,获得更短的数组。

但是,如果回调函数只能返回一个元素,那么我就不推荐使用这个方法,例如使用回调函数来过滤唯一 ID。在这种情况下,Array.filter 将返回一个只包含一个元素的新数组。我们的意图可能是通过查找特定的 ID 找到数组中包含的唯一值。

我们来看看这个方法的性能。要返回与回调函数匹配的所有元素,Array.filter 必须遍历整个数组。此外,我们假设有数百个元素可以满足回调参数,那么过滤后的数组会非常大。

为了避免这种情况,我建议使用 Array.find。它需要一个像 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' }

用 Array.some 代替 Array.find

我承认这个错误我犯了很多次。然后,一位善良的朋友告诉我,最好可以先参考 MDN 文档。这与上面的 Array.indexOf/Array.includes 非常相似。

在前面的例子中,我们看到 Array.find 需要一个回调函数作为参数,并返回一个元素。如果我们想要知道数组是否包含某个值,Array.find 是最好的解决方案吗?可能不是,因为它返回的是一个元素值,而不是一个布尔值。

对于这种情况,我建议使用 Array.some,它返回所需的布尔值。另外,从语义上看,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

使用 Array.reduce 而不是链接 Array.filter 和 Array.map

让我们面对现实吧,Array.reduce 不容易理解。事实确实如此!但是,如果我们使用 Array.filter 和 Array.map 的组合,感觉缺少了什么,对吧?

我的意思是,我们遍历了两次数组。第一次过滤数组并创建一个较短的数组,第二次又基于 Array.filter 获得数组创建一个包含新值的数组。为了获得我们想要的新数组,我们使用了两个 Array 方法。每个方法都有自己的回调函数和一个用不到的数组——由 Array.filter 创建的那个数组。

为了避免这种性能损耗,我的建议是使用 Array.reduce。结果是一样的,代码却更简单! 我们可以使用 Array.reduce 进行过滤,并将目标元素添加到累加器中。累加器可以是递增的数字、要填充的对象、要连接的字符串或数组。

在我们的例子中,因为之前使用了 Array.map,所以我建议使用 Array.reduce 将满足条件的数组元素加入到累加器中。在下面的示例中,根据 env 值的具体情况,我们将它添加到累加器中或保持累加器不变。

'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'] }
// ]

英文原文:

https://medium.freecodecamp.org/heres-how-you-can-make-better-use-of-javascript-arrays-3efd6395af3c

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jQuery弹出(alert)select选择的值
Apr 21 Javascript
javascript scrollTop正解使用方法
Nov 14 Javascript
jquery 页面滚动到底部自动加载插件集合
Jan 31 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 Javascript
关于不同页面之间实现参数传递的几种方式讨论
Feb 13 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
May 17 Javascript
微信小程序三级联动地址选择器的实例代码
Jul 12 Javascript
微信小程序 获取session_key和openid的实例
Aug 17 Javascript
JavaScript中var的重要性实例分析
Jul 09 Javascript
Vue实现导航栏的显示开关控制
Nov 01 Javascript
JavaScript字符串处理常见操作方法小结
Nov 15 Javascript
Node.js文本文件BOM头的去除方法
Nov 22 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
Sep 11 #Javascript
详解webpack模块加载器兼打包工具
Sep 11 #Javascript
webpack css加载和图片加载的方法示例
Sep 11 #Javascript
vue1.0和vue2.0的watch监听事件写法详解
Sep 11 #Javascript
webpack的CSS加载器的使用
Sep 11 #Javascript
JavaScript基础教程之如何实现一个简单的promise
Sep 11 #Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
Sep 11 #Javascript
You might like
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
Python中GIL的使用详解
2018/10/03 Python
如何基于python实现脚本加密
2019/12/28 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
企业厂长岗位职责
2013/12/17 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
幼儿园小班班务总结
2015/08/03 职场文书