js嵌套数组的展开

实现一个嵌套数组的flat方法,展开深度为可根据参数设定展开深度,效果如下:

var arr = [1,2,[3,4],[5,[6,7]]]
var flatArr = flat(arr,1)
console.log(flatArr)

展开结果:[1,2,3,4,5,[6,7]]

我知道Array对象的flat方法,如果要自己封装flat方法要怎么做呢

阅读 9.8k
3 个回答

是写出这个方法的大致逻辑嘛?

    function flat(arr, deepth) {
      newArr = []
      deepth--
      arr.forEach(v => {
        if (v instanceof Array) {
          newArr.push(...v)
        } else {
          newArr.push(v)
        }
      })

      if (deepth > 0)
        flat(newArr, deepth)

      return newArr
    }

    var arr = [1, 2, [3, 4],
      [5, [6, 7,[8,9,10]]]
    ]
    var flatArr = flat(arr, 2)
    console.log(flatArr)

参考 MDN Array.prototype.flat(),使用 flat 或 reduce

// 使用 reduce、concat 和递归无限反嵌套多层嵌套的数组
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];

function flattenDeep(arr1) {
   return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
}
flattenDeep(arr1);
// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
// 不使用递归,使用 stack 无限反嵌套多层嵌套数组
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
function 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();
}
flatten(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题