js 如何平拆嵌套数组

时间:2024-10-07 07:37:06

在 JavaScript 中,如果你有一个嵌套数组,并且想要将其“平拆”(即将所有嵌套层级的元素展开到一个单层数组中),可以使用递归或迭代的方法来实现。以下是两种常见的实现方式:

方法一:使用递归

递归方法非常直观,因为你可以定义一个函数,该函数会检查每个元素,如果元素是数组,则递归调用自身,否则将元素添加到结果数组中。

function flattenArray(arr) {
  let result = [];
  
  arr.forEach(item => {
    if (Array.isArray(item)) {
      result = result.concat(flattenArray(item));
    } else {
      result.push(item);
    }
  });
  
  return result;
}

// 示例
const nestedArray = [1, [2, [3, [4]], 5]];
const flatArray = flattenArray(nestedArray);
console.log(flatArray); // 输出: [1, 2, 3, 4, 5]

方法二:使用迭代(栈)

迭代方法通常更节省内存,因为它避免了递归调用栈的开销。你可以使用一个栈来模拟递归过程。

function flattenArrayIterative(arr) {
  let result = [];
  let stack = [...arr];
  
  while (stack.length) {
    const item = stack.pop();
    
    if (Array.isArray(item)) {
      stack.push(...item);
    } else {
      result.push(item);
    }
  }
  
  // 由于我们是使用栈(后进先出),结果数组需要反转
  return result.reverse();
}

// 示例
const nestedArray = [1, [2, [3, [4]], 5]];
const flatArray = flattenArrayIterative(nestedArray);
console.log(flatArray); // 输出: [1, 2, 3, 4, 5]

方法三:使用 ES6 的 Array.prototype.flat()

如果你使用的是较新的 JavaScript 版本(ES2019 及以上),你可以直接使用 Array.prototype.flat() 方法,它可以指定展开数组的层级(默认为1层)。对于完全展开的数组,可以使用 Infinity 作为参数。

const nestedArray = [1, [2, [3, [4]], 5]];
const flatArray = nestedArray.flat(Infinity);
console.log(flatArray); // 输出: [1, 2, 3, 4, 5]

总结

  • 递归方法:简单直观,但可能会因为深度嵌套而导致栈溢出。
  • 迭代方法:使用栈来避免递归的栈溢出问题,但代码稍微复杂一些。
  • ES6 方法:简洁高效,适用于现代 JavaScript 环境。

选择哪种方法取决于你的具体需求和所使用的 JavaScript 版本。