学习链接

MDN

JavaScript专题之数组扁平化

269个JavaScript工具函数,助你提升工作效率(新)

一文搞定数组扁平化(超全面的数组拉平方案及实现)

数组扁平化

flatflatMap

数组扁平化 - 图1

  1. [1, 2, , 4, 5].flat()
  2. // [1, 2, 4, 5]
  3. [1, 2, [3, [4, 5]]].flat()
  4. // [1, 2, 3, [4, 5]]
  5. [1, 2, [3, [4, 5]]].flat(2)
  6. // [1, 2, 3, 4, 5]
  7. [1, [2, [3]]].flat(Infinity)
  8. // [1, 2, 3]
  1. // 相当于 [[2, 4], [3, 6], [4, 8]].flat()
  2. [2, 3, 4].flatMap((x) => [x, x * 2])
  3. // [2, 4, 3, 6, 4, 8]
  4. // 相当于 [[[2]], [[4]], [[6]], [[8]]].flat()
  5. [1, 2, 3, 4].flatMap(x => [[x * 2]])
  6. // [[2], [4], [6], [8]]

不用 flatflatMap

  1. function flatten(arr) {
  2. while(arr.some(item => Array.isArray(item))) {
  3. arr = [].concat(...arr);
  4. }
  5. return arr;
  6. }
  1. Array.prototype.myFlat = function (depth = 1) {
  2. if (depth < 1) return [...this];
  3. return this.map(val => {
  4. return [].concat(Array.isArray(val) ? val.myFlat(depth - 1) : val);
  5. });
  6. }
  1. Array.prototype.myFlat = function (depth = 1) {
  2. if (depth < 1) return this.slice();
  3. return this.reduce((arr, val) => {
  4. return arr.concat(Array.isArray(val) ? val.myFlat(depth - 1) : val);
  5. }, []);
  6. }
  1. function* flatten(array) {
  2. for (const item of array) {
  3. if (Array.isArray(item)) {
  4. yield* flatten(item);
  5. continue;
  6. }
  7. yield item;
  8. }
  9. }
  10. const arr = [1, 2, [3, 4, [5, 6]]];
  11. const flattened = [...flatten(arr)];