ES6 数组方法flat()

895 阅读1分钟

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);