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

自定义flat函数中数组concat未生效,为何嵌套数组元素丢失?

问题原因与修复方案

核心问题:concat的使用方式错误

Array.concat()方法的特性是返回一个新数组,不会修改调用它的原数组。你当前代码里只执行了newarr.concat(arr[i]),但没有把这个新数组重新赋值给newarr,所以原newarr完全没被更新,嵌套数组里的元素自然无法被添加进去。

次要问题:元素判断逻辑有误

你用Number.isInteger(arr[i])来判断是否要将元素加入新数组,这会导致非整数的非数组元素(比如字符串'abc'、布尔值true等)被忽略。正确的逻辑应该是:只要当前元素不是数组,就直接加入新数组,不用限制类型。

修复后的代码

const flat = function(arr, n) {
  if (n === 0) {
    return arr;
  } else if (n === 1) {
    let newarr = [];
    for (let i = 0; i < arr.length; i++) {
      if (Array.isArray(arr[i])) {
        // 将concat返回的新数组赋值给newarr,完成拼接
        newarr = newarr.concat(arr[i]);
      } else {
        // 非数组元素直接加入,不再限制类型
        newarr.push(arr[i]);
      }
    }
    return newarr;
  }
};

扩展(支持n>1的深层扁平化)

如果需要处理更深层次的嵌套数组,可以用递归实现完整逻辑:

const flat = function(arr, n) {
  if (n === 0) return arr;
  let newarr = [];
  for (const item of arr) {
    if (Array.isArray(item) && n > 0) {
      // 递归处理嵌套数组,同时将扁平化层级减1
      newarr = newarr.concat(flat(item, n - 1));
    } else {
      newarr.push(item);
    }
  }
  return newarr;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:30:22