基础
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 + includes
arr.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 + some
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr)
}
数组元素出现个数/数组中重复的元素
// map + filter
function search(arr) {
const map = new Map()
// 没有就存,有就加1
for (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])
}