js 数组操作方法总结
去重
方法一
相当于双层 for 循环,时间复杂度 O(n²)
1 | function uniq(){ |
1 | function uniq(arr) { |
方法二
ES6 的 Set 结构
1 | function uniq(arr) { |
方法三
对象 key 的唯一,时间复杂度 O(n)
1 |
|
拉平嵌套数组
- es6 中数组的操作方法
flat
可以返回扁平化的数组,不修改原数组,默认参数是1
,只拉平一层嵌套的数组,如果是多层的需要传入层数,最大是Math.pow(2,53)-1
1 | function flattenDeep(arr, deepLength) { |
2.利用 concat 和 reduce
1 | function flattenDeep(arr, deepLength) { |
3.stack 无限反嵌套数组
1 | function flattenDeep(inputArr) { |
数组遍历
var peoples=[‘Tom’,’Jerry’,’Jack’,’Mary’]
for 循环
ES5
1 | for(let i =0; i<peoples.length; i++){ |
for…in
1 | for(let i in peoples){ |
for…of
1 | for(let people of peoples){ |
forEach
ES6
1 | peoples.forEach(people=>{ |
map
将数组映射成另一个数组,返回新数组。
如果没有return
,默认返回undefined
。
1 | let new_peoples=peoples.map(people=>({name:people,age:10})) |
filter
返回数组中符合条件的元素组成新数组。
1 | let peoples=[{name:'Tom',age:10},{name:'Jerry',age:11},{name:'Jack',age:11},{name:'Mary',age:10}] |
find
参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为 true 的成员,然后返回该成员。如果没有符合条件的成员,则返回 undefined。
1 | let peoples=[{name:'Tom',age:10},{name:'Jerry',age:11},{name:'Jack',age:11},{name:'Mary',age:10}] |
every
数组中是否每个元素都满足指定的条件
返回Boolean
1 | peoples.every(people=>people.age>10)//false |
some
数组中是否有元素满足指定的条件
返回Boolean
1 | peoples.some(people=>people.age>10)//true |
reduce
求和
1 | let arr=[1,2,3,4]; |
- prev:第一项的值或上一次叠加的结果值
- cur:当前会遍历的值
- index:当前值的索引
- arr:数组本身
- 传入参数 0,叠加的初始值
如果不传入参数,第一个 prev 就是第一项的值,cur 是第二项的值,如果传参,第一个 prev 就是传入参数,cur 就是数组第一项的值。
传入参数的类型决定 reduce 最终结果
计算字符串中字母出现的次数
1 | var str='asdaaddad'; |
Array.from()
将类数组转化为数组。
类数组:一个对象的所有键名都是正整数或零,并且具有length
属性,例如 arguments,DOM 元素集,字符串。
参数:
obj
:要转换的对象map
:类似数组的 map 方法,用来对每个对象进行处理,处理后返回一个数组context
:绑定 map 中用到的this
只要是部署了 iterator 接口的数据结构,Array.from 都能将其转为数组:
1 | let arr=Array.from('Hello');//['H','e','l','l','o']; |
Array.from()
可以将各种值转为真正的数组,并且还提供map
功能。这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法。
1 | Array.from({ length: 2 }, () => 'jack')// ['jack', 'jack'] |
Array.of(v1,v2,v3)
将传入的所有参数转换为一个数组,而不管参数的数量与类型。
1 | Array.of(1,'1','a',true,{a:1}) |