数组扁平化 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]
复制代码
相关文章
相关标签/搜索