首页 > 解决方案 > 用堆栈展平数组

问题描述

我正在尝试使用堆栈迭代地展平数组(或者在此示例中拼接结果数组而不是从堆栈中添加/删除)直到特定深度(除了学习之外没有任何实际原因)。

到目前为止我有

function flatten(arr, depth = 1) {

    let flat = [];
    let i = 0;

    let d = depth;

    for (let elem of arr) {
        flat.push(elem);
        d = depth;

        while(i < flat.length) {
            if (Array.isArray(flat[i]) && d !== 0) {
                flat.splice(i, 1, ...flat[i]);
                d--;

            } else {
                i++;
            }
        }


    }

    return flat;
}

但是如果我有一个诸如 [[3], 4, [5, [6]] 之类的级别,它就会倒下,因为一旦它进入“3”的深度,它就不会退出。

我可以做一个简单的修改吗?

我使用的原始数组是flatten([[1],2,[[3], 'ddd', [4,[5]]]], 2),我希望结果是 [1,2,3,'ddd',4, [5]]

如果我通常使用堆栈实现它,我也会遇到同样的问题。

标签: javascriptarrays

解决方案


我认为你可以用一种非常干净的方式完成它concatreduce

const flatten = (array, depth) => {
  if(!depth) return array;
  while(depth > 0) {
    array = array.reduce((pre, curr) => pre.concat(curr), []);
    depth--;
  }
  return array;
}

const flat = flatten([1, 2, ['a', 3], [4, [6, 4]], 3, [1, 3], [[['a', 2], 2, 'b'], 'c', 3], 4], 2);
console.log(flat)

基本上它所做的是遍历数组depth时间。每次传递都会将reduce数组传递到另一个数组,该数组是concat前一个数组中每个元素的。要点是concat有两种不同的可能调用:

  1. 当使用非数组参数调用时,它只是将元素添加到原始数组
  2. 当使用数组参数调用时,它将给定数组的每个元素添加到原始元素

所以基本上“扁平化”的核心已经concat自己完成了,你只需要继续这样做depth


推荐阅读