ES6 数组方法flat()
作用:将数组扁平化,对每一项的值进行循环处理,如果该项的值也是数组,则取出来(相当于去掉了这项数组的[]括号)
flat(n)将每一项的数组偏平化,n默认是1,表示扁平化深度.
let a = ['a',["a","b"],{"a":"aaaa"},
[
{"bb":"bbbb"},
{"c":[
{"c1":"ccc111111"}
]
},
[12,22,32]
]
];
let b = a.flat(); // [ 'a', 'a', 'b', {'a': 'aaaa'}, {'bb':'bbbb'},{'c':[...]},12,22,32]
b[4]["bb"] = "b2b2b2b2b2b2"; //影响了原数组a,以及新数组bb
b[5].c[0].c1 = "ccc12121211111"; //影响了原数组a,以及新数组bb
let bb = a.flat(2);
console.log(a, b, bb);
下面用自己的代码实现flat
let a = ['a',["a","b"],{"a":"aaaa"},
[
{"bb":"bbbb"},
{"c":[
{"c1":"ccc111111"}
]
},
[12,22,32]
]
];
function myFlat(dept) {
let arr = this;
dept = typeof dept === "undefined" ? 1 : dept;
if (typeof dept !== "number") {
return;
}
let res = JSON.parse(JSON.stringify(arr));
let testNum = 0;
let reduceArr = function (_arr) {
console.log(++testNum);
return _arr.reduce(function(prevItem, curItem){
return prevItem.concat(curItem);
},[])
};
for (let i = 0; i < dept; i++) {
let hasArrayItem = res.some(function(item){
return Array.isArray(item);
});
if (hasArrayItem) {
res = reduceArr(res);
}
}
return res;
}
Array.prototype.myFlat = myFlat;
let c = a.myFlat();
c[4]["bb"] = "b2b2b2b2b2b2"; //并没有影响原数组a,以及新数组bb
let cc = a.myFlat(2);
console.log(a, c, cc);