You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JS基础方法实现任意深度多维数组扁平化的zooInventory函数

多维数组扁平化实现方案(zooInventory函数)

原有代码问题

你编写的代码核心问题是递归调用zooInventory后,返回的子数组扁平化结果没有合并到当前的结果数组中,导致嵌套层级的元素全部丢失,没有达到预期效果。

符合你现有技术栈的最优实现

你提到想在else分支用push结合展开运算符实现,正好可以通过接收递归返回值的方式实现,适配任意层数的嵌套数组:

const zooInventory = array => {
  let finalArray = [];
  for (let i = 0; i < array.length; i++) {
    const currentElement = array[i];
    if (!Array.isArray(currentElement)) {
      // 非数组元素直接推入结果集,如果仅需要字符串可在此处加typeof判断
      finalArray.push(currentElement);
    } else {
      // 递归处理嵌套数组,用展开运算符将子级扁平化结果全部推入当前结果集
      finalArray.push(...zooInventory(currentElement));
    }
  }
  return finalArray;
}

可选优化:仅保留字符串类型的动物介绍

如果需要过滤掉数组中的非字符串元素(比如示例中的数字2),可以在推入非数组元素时增加类型判断:

const zooInventory = array => {
  let finalArray = [];
  for (let i = 0; i < array.length; i++) {
    const currentElement = array[i];
    if (!Array.isArray(currentElement)) {
      typeof currentElement === 'string' && finalArray.push(currentElement);
    } else {
      finalArray.push(...zooInventory(currentElement));
    }
  }
  return finalArray;
}

ES2019+ 简化内置实现

如果运行环境支持ES2019及以上标准,可以直接用数组内置的flat方法实现,代码更简洁:

// Infinity参数表示扁平任意深度的嵌套数组,后面的filter用来过滤非字符串元素
const zooInventory = array => array.flat(Infinity).filter(item => typeof item === 'string');

测试验证

输入示例:

const Array1 = ['大熊猫是中国国宝', ['金丝猴是国家一级保护动物'], ['小熊猫外形像猫,全身红褐色', 2, 'x']];
console.log(zooInventory(Array1));

输出结果(带字符串过滤的版本):

['大熊猫是中国国宝', '金丝猴是国家一级保护动物', '小熊猫外形像猫,全身红褐色', 'x']

内容的提问来源于stack exchange,提问作者22RookieMistakesJS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:06:02