數組扁平化 Array.flat() 替代方案

JavaScript Array 屬性、方法 (一)javascript

JavaScript Array 屬性、方法 (二)java

使用 reduceconcat

  1. 只有兩級數組的扁平化
let arr = [1, 2, [3, 4]];

let result1 = arr.flat();
console.log(result1);
// output[Array]: [1, 2, 3, 4]

let result2 = arr.reduce((acc, val) => acc.concat(val), []);
console.log(result2);
// output[Array]: [1, 2, 3, 4]

const flattened = arr => [].concat(...arr);
let result3 = flattened(arr);
console.log(result3)
// output[Array]: [1, 2, 3, 4]
複製代碼
  1. 使用 reduceconcat 和遞歸無限反嵌套多層嵌套的數組
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
const flattenDeep = arr1 => {
  return arr1.reduce(
    (acc, val) =>
    Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val),
    []
  );
};
let result = flattenDeep(arr1);
console.log(result)
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼
  1. 不使用遞歸,使用 stack 無限反嵌套多層嵌套數組
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
const flatten = input => {
  const stack = [...input];
  const res = [];
  while (stack.length) {
    // 使用 pop 從 stack 中取出並移除值
    const next = stack.pop();
    if (Array.isArray(next)) {
      // 使用 push 送回內層數組中的元素,不會改動原始輸入 original input
      stack.push(...next);
    } else {
      res.push(next);
    }
  }
  // 使用 reverse 恢復原數組的順序
  return res.reverse();
};
let result = flatten(arr1);
console.log(result);
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼
  1. 遞歸版本的反嵌套
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
const flatten = array => {
  let flattend = [];
  (function flat(array) {
    array.forEach(el => {
      if (Array.isArray(el)) flat(el);
      else flattend.push(el);
    });
  })(array);
  return flattend;
};
let result = flatten(arr1);
console.log(result)
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼

reduce + concat + isArray + recursivity

let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
let arr = [1, 2, [3, 4, [5, 6]]];

const flatDeep = arr => {
   return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val) : val), []);
};

let result = flatDeep(arr1);
console.log(result)
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼

使用堆棧(Use a stack)

let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
// 使用堆棧進行非遞歸深度展平
const flatten = input => {
  const stack = [...input];
  const res = [];
  while (stack.length) {
    const next = stack.pop();
    if (Array.isArray(next)) {
      stack.push(...next);
    } else {
      res.push(next);
    }
  }
  // 使用 reverse 恢復原數組的順序
  return res.reverse();
};

let result = flatten(arr1);
console.log(result);
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼

使用生成器函數(Use Generator function)

let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
function* flatten(array) {
  for (const item of array) {
    if (Array.isArray(item)) {
      yield* flatten(item);
    } else {
      yield item;
    }
  }
}

const flattened = [...flatten(arr1)];

console.log(flattened);
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼
相關文章
相關標籤/搜索