自定义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
相关产品推荐
相关产品推荐

