基础
ES5
- splice()
- push() pop() // 增加,删除
- shift() unshift() // 删除数组首位,在数组首位插入一个元素
- sort() // 默认排序顺序为按字母升序,数字升序
reverse() // 数组元素方向反转
concat() // 先创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回新构建的数组,不影响原始数组
- slice(begin, end) // 浅拷贝数组的元素
- indexOf() // 返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1,(indexOf不能识别NaN)
- lastIndexOf()
- Array.isArray() // 用于确定传递的值是否是一个 Array
- join()
- map()
- filter()
- every() // 每一项都符合条件才返回true
- some() // 有一个符合添加就返回true
Array.reduce()
对累加器和数组中的每个元素(从左到右)应用一个函数,将其简化为单个值
accumulator 累加器累加回调的返回值
currentValue 数组中正在处理的元素
initialValue 累加器的初始值 ```javascript arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
let arr = [{ id: 1, type: ‘A’, total: 3 }, { id: 2, type: ‘B’, total: 5 }, { id: 3, type: ‘E’, total: 7 },…] // 所有total的值 arr.reduce((sum, { total }) => { return sum + total; }, 0)
<a name="kfsY8"></a>### ES6- Array.fill(item,start,end) -- 填充数组- find() -- 找出第一个符合条件的数组成员- findIndex -- 返回第一个符合条件的数组成员的位置- [1, [2, [3]]].flat(Infinity) -- 拉平嵌套的数组,都转成一维数组- includes() -- includes可以检测NaN,indexOf不能检测NaN- Array.of() -- 返回由所有参数值组成的数组- entries(),keys(),values() -- 遍历<a name="CoHtK"></a>#### Array.from(arrayLike,mapFn,thisArg)从类似数组或可迭代对象创建一个新的(浅拷贝)的数组实例 <br /> mapFn 新数组中的每个元素会执行该函数 <br /> thisArg 执行回调函数mapFn时this对象<a name="AgSlR"></a>## 常用操作<a name="kqseY"></a>### 判断是不是数组的方法```javascript[1, 2, 3] instanceof Array[1, 2, 3].constructor === Array// 最常用Array.isArray([1, 2, 3])Object.prototype.toString.call([1, 2, 3]) === '[object Array]'
类数组和数组的转换
类数组: 拥有length属性, 类型为Object, 元素属性名是数值或者可转换为数值的字符
Array.prototype.slice.call(xArr);Array.from(xArr)Array.of(xArr)[...xArr]// 传给 apply 的第二个参数(数组或者类数组)会被转换为一个参数列表Array.apply(null,xArr)// 遍历push
数组去重
// 利用 set 去重[...new Set(arr)]Array.from(new Set(arr))// 双重循环 + 相等则 splice 移除// 新建数组 + 添加前includes验证arr.forEach((item,index) => {if(!res.includes(item)){res.push(item)}})// 新建数组 + 添加前map验证function unique(arr){let map = new Map()for(item of arr){if(!map.has(item)){map.set(item,true)}}return [...map.keys()]}// reduce + includesarr.reduce((acc,cur) => {// return acc.includes(cur) ? acc : acc.concat(cur)return acc.includes(cur) ? acc : [...acc,cur]},[])
数组扁平化
let arr = [1,[1,2,[3]]]// flat 传参 Infinity,实现完全降维arr.flat(Infinity)// reduce + 递归function flatten(arr) {return arr.reduce((acc, cur) => {if (Array.isArray(cur)) {return [...acc, ...flatten(cur)]} else {return [...acc, cur]}},[])}// forEach + 递归// 先转为字符串去掉括号,再 split 转数组 (数据类型相同)arr.toString().split(",")// while + somewhile(arr.some(item => Array.isArray(item))){arr = [].concat(...arr)}
数组元素出现个数/数组中重复的元素
// map + filterfunction search(arr) {const map = new Map()// 没有就存,有就加1for (item of arr) {if (!map.has(item)) {map.set(item, 1)} else {map.set(item, map.get(item) + 1)}}// 找出重复元素,即出现次数大于1// const searchArr = [...map.entries()].filter(item => item[1] > 1) // 过滤出item[1]即次数大于1的// return searchArr.map(item => item[0]) // 提出item[0]也就是值// 找出重复次数最多的元素return [...map.entries()].filter(item => item[1] === Math.max(...map.values())).map(item => item[0])}
