# 扁平化

案例:

let arr = [[1, 3, 2, 1],[5, 3,[ '', '' ], 4, 8, 5, 6, 5],[6, 2, 8, 9, [4, 11, 15, 8, 9, 12, [12, 13, [10], 14]]], 16];
1
  1. 使用toString
    转换成','分离的字符串,并使用split分割
    缺点: 转换的都为字符串, 数组中有空数组不建议使用
let newArr = arr.toString().split(',');
1
  1. 正则表达式 /[|]/g
let arrStr = JSON.stringify(arr).replace(/\[|\]/g, "")
let newArr1 =JSON.parse("[" +arrStr + "]");
1
2
  1. reduce + 递归
function flatten(list) {
  return list.reduce((a, b)=> {
    return a.concat(Array.isArray(b) && b ? flatten(b) : b)
  },[])
}
1
2
3
4
5
  1. Array.prototype.flat 注意: node.js中,不支持flat
let arr1 = arr.flat(Infinity);
1

5.遍历数组 + 递归

let lsArr = [];
function f(arr) {
  for (let i in arr) {
    if (arr[i] instanceof Array) {
      f(arr[i])
    } else {
      lsArr.push(arr[i])
    }
  }
}
let s = f(arr)
1
2
3
4
5
6
7
8
9
10
11

# 去重

let arr =[1, 3, 2, 1, 5, 3, 4, 8, 5, 6, 5, 6, 2, 8, 9, 4, 11, 15, 8, 9, 12, 12, 13, 10, 14, 16]
1
  1. es6 Set结构
let newArray =Array.from(new Set(arr));
1
  1. reduce 注意: indexOf的复杂度为O(n)
let newArray1 = arr.reduce((a, b)=>{
  if (a.indexOf(b) === -1) {
    a.push(b)
  }
  return a;
},[])
1
2
3
4
5
6

3.排序相邻去重法 注意:
以下三种循环方式,速度快慢:3 > 1 > 2

// 1
  for (var i = 0; i < arr.length; i++) {}
//2
for (var i in arr){}
//3
for (var i = 0, len = arr.length; i < len; i++){}
1
2
3
4
5
6
function f(arr) {
  arr.sort((a,b)=>a - b);
  let newArr = [arr[0]];
  for (let i = 1 ; i < arr.length;i++) {
    if (arr[i] !== newArr[newArr.length - 1]) {
      newArr.push(arr[i])
    }
  }
  return newArr;
}
1
2
3
4
5
6
7
8
9
10
  1. 数组下标去重 原理:利用filter 与indexOf,判断元素是否在数组中出现过了,
    如果出现过了,indexOF返回的index与当前元素的index的值就对不上,则过滤。
let a = arr.filter((ele, index, farr) => {
  return farr.indexOf(ele) === index
})
1
2
3
最后更新时间: 6/20/2022, 10:48:50 PM