什么是数组扁平化?
我们可以这样理解,给定一个一维数组我们可以认为它是一个线性序列,二维数组则是一个平面序列,同理三维数组是立体序列。好的,现在我们有一个正方体,我们怎么将这个正方体变成一个正方形呢,我们可以从它的某一个面开始挤压,直到压扁到成一个平面就可以了,同理,沿着这个正方形的某条边开始挤压,可以将这个平面压扁成一条线。
因此,数组扁平化的本质就是降维。
数组扁平化的方法
// 给定一个数组arr
let arr = [1, 2, [3, [4, 5, [6]]]];
1. reduce
let flat = (arr) => {
return arr.reduce((prev, cur) => {
if (Array.isArray(cur)) {
return prev.concat(flat(cur));
} else {
return prev.concat(cur);
}
}, []);
}
2. toString
let flat = (arr) => {
return arr.toString().split(',').map((ele) => {
return +ele;
})
}
3. 扩展运算符...
let flat = (arr) => {
var newArr = [];
var len = arr.length;
for (var i = 0; i < len; i ++) {
if (Array.isArray(arr[i])) {
newArr.push(...flat(arr[i]));
} else {
newArr.push(arr[i]);
}
}
return newArr;
}
4. ES6的Array.prototype.flat(depth)
let arr1 = arr.flat(1); // [1, 2, 3, [4, 5, [6]]]
let arr2 = arr.flat(2); // [1, 2, 3, 4, 5, [6]]
let arr3 = arr.flat(Infinity); // [1, 2, 3, 4, 5, 6]
5. 实现Array.prototype.myFlat(depth)
Array.prototype.myFlat = function (depth) {
if (depth < 1) {
return this;
}
if (depth === 1) {
return this.reduce((prev, cur) => {
return prev.concat(cur);
}, []);
} else {
return this.reduce((prev, cur, index, self) => {
if (Array.isArray(cur)) {
return prev.concat(cur.myFlat(depth - 1));
} else {
return prev.concat(cur);
}
}, []);
}
}