基础

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)

  1. <a name="kfsY8"></a>
  2. ### ES6
  3. - Array.fill(item,start,end) -- 填充数组
  4. - find() -- 找出第一个符合条件的数组成员
  5. - findIndex -- 返回第一个符合条件的数组成员的位置
  6. - [1, [2, [3]]].flat(Infinity) -- 拉平嵌套的数组,都转成一维数组
  7. - includes() -- includes可以检测NaN,indexOf不能检测NaN
  8. - Array.of() -- 返回由所有参数值组成的数组
  9. - entries(),keys(),values() -- 遍历
  10. <a name="CoHtK"></a>
  11. #### Array.from(arrayLike,mapFn,thisArg)
  12. 从类似数组或可迭代对象创建一个新的(浅拷贝)的数组实例 <br /> mapFn 新数组中的每个元素会执行该函数 <br /> thisArg 执行回调函数mapFn时this对象
  13. <a name="AgSlR"></a>
  14. ## 常用操作
  15. <a name="kqseY"></a>
  16. ### 判断是不是数组的方法
  17. ```javascript
  18. [1, 2, 3] instanceof Array
  19. [1, 2, 3].constructor === Array
  20. // 最常用
  21. Array.isArray([1, 2, 3])
  22. Object.prototype.toString.call([1, 2, 3]) === '[object Array]'

类数组和数组的转换

类数组: 拥有length属性, 类型为Object, 元素属性名是数值或者可转换为数值的字符

  1. Array.prototype.slice.call(xArr);
  2. Array.from(xArr)
  3. Array.of(xArr)
  4. [...xArr]
  5. // 传给 apply 的第二个参数(数组或者类数组)会被转换为一个参数列表
  6. Array.apply(null,xArr)
  7. // 遍历push

数组去重

  1. // 利用 set 去重
  2. [...new Set(arr)]
  3. Array.from(new Set(arr))
  4. // 双重循环 + 相等则 splice 移除
  5. // 新建数组 + 添加前includes验证
  6. arr.forEach((item,index) => {
  7. if(!res.includes(item)){
  8. res.push(item)
  9. }
  10. })
  11. // 新建数组 + 添加前map验证
  12. function unique(arr){
  13. let map = new Map()
  14. for(item of arr){
  15. if(!map.has(item)){
  16. map.set(item,true)
  17. }
  18. }
  19. return [...map.keys()]
  20. }
  21. // reduce + includes
  22. arr.reduce((acc,cur) => {
  23. // return acc.includes(cur) ? acc : acc.concat(cur)
  24. return acc.includes(cur) ? acc : [...acc,cur]
  25. },[])

数组扁平化

  1. let arr = [1,[1,2,[3]]]
  2. // flat 传参 Infinity,实现完全降维
  3. arr.flat(Infinity)
  4. // reduce + 递归
  5. function flatten(arr) {
  6. return arr.reduce((acc, cur) => {
  7. if (Array.isArray(cur)) {
  8. return [...acc, ...flatten(cur)]
  9. } else {
  10. return [...acc, cur]
  11. }
  12. },[])
  13. }
  14. // forEach + 递归
  15. // 先转为字符串去掉括号,再 split 转数组 (数据类型相同)
  16. arr.toString().split(",")
  17. // while + some
  18. while(arr.some(item => Array.isArray(item))){
  19. arr = [].concat(...arr)
  20. }

数组元素出现个数/数组中重复的元素

  1. // map + filter
  2. function search(arr) {
  3. const map = new Map()
  4. // 没有就存,有就加1
  5. for (item of arr) {
  6. if (!map.has(item)) {
  7. map.set(item, 1)
  8. } else {
  9. map.set(item, map.get(item) + 1)
  10. }
  11. }
  12. // 找出重复元素,即出现次数大于1
  13. // const searchArr = [...map.entries()].filter(item => item[1] > 1) // 过滤出item[1]即次数大于1的
  14. // return searchArr.map(item => item[0]) // 提出item[0]也就是值
  15. // 找出重复次数最多的元素
  16. return [...map.entries()].filter(item => item[1] === Math.max(...map.values())).map(item => item[0])
  17. }