# 扁平化
案例:
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
- 使用toString
转换成','分离的字符串,并使用split分割
缺点: 转换的都为字符串, 数组中有空数组不建议使用
let newArr = arr.toString().split(',');
1
- 正则表达式 /[|]/g
let arrStr = JSON.stringify(arr).replace(/\[|\]/g, "")
let newArr1 =JSON.parse("[" +arrStr + "]");
1
2
2
- reduce + 递归
function flatten(list) {
return list.reduce((a, b)=> {
return a.concat(Array.isArray(b) && b ? flatten(b) : b)
},[])
}
1
2
3
4
5
2
3
4
5
- 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
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
- es6 Set结构
let newArray =Array.from(new Set(arr));
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
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
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
2
3
4
5
6
7
8
9
10
- 数组下标去重
原理:利用filter 与indexOf,判断元素是否在数组中出现过了,
如果出现过了,indexOF返回的index与当前元素的index的值就对不上,则过滤。
let a = arr.filter((ele, index, farr) => {
return farr.indexOf(ele) === index
})
1
2
3
2
3