问题:数组扁平化,将递归处理的结果放置到res中,但res.push结果无效
//错误做法:
let fn = function(arr){
let res = []
arr.forEach(element => {
if(Array.isArray(element)){
res.push(fn(element));
}else{
res.push(element);
}
})
return res;
}
原因:push方法将数组原本的形式输出,不进行解析
//改正:
let fn = function(arr){
let res = []
arr.forEach(element => {
if(Array.isArray(element)){
res =res.concat(fn(element));
//或者
//res.push.apply(res,fn(element))
//或者 剩余符号
//res.push(...fn(element))
}else{
res.push(element);
}
})
return res;
}
- push和concat区别:
-
push 改变原有数组的数据
concat方法是在原有的基础上添加元素并返回链接之后的副本,并不会修改原有的数组。 -
push方法会把数组原原本本的输出;
concat方法会把数组解析之后再输出。例如:
var array = arr.concat(4,[5,6]) //[1, 2, 3, 4, 5, 6]
arr.push(4,[5,6]); //[1, 2, 3, 4, Array(2)] Array(2) [5,6]
- 此外,数据扁平化也可以在原型链上实现:
Array.prototype.fakeflat = function(){
let res = [];
this.forEach(item => {
if (Array.isArray(item)) {
res.push.apply(res,item.fakeflat());//注意push和concat的区别!!!!
// res = res.concat(item.fakeflat());
} else {
res.push(item);
}
});
return res;
}