push和concat的区别:数组扁平化时遇到的问题

238 阅读1分钟

问题:数组扁平化,将递归处理的结果放置到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区别:
  1. push 改变原有数组的数据
    concat方法是在原有的基础上添加元素并返回链接之后的副本,并不会修改原有的数组。

  2. 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;
}