为何空元素绕过条件判断?嵌套数组过滤函数问题排查
嵌套数组过滤函数空元素未拦截的原因及修复
你的filteredArray函数在测试filteredArray([["trumpets", 2], ["flutes", 4], ["saxophones", 2]], 2)时返回[ , [ 'flutes', 4 ] ],问题出在两个核心点:
1. 空数组判断逻辑错误
你用arr[i]!=""来判断子数组是否为空,但空数组[]和空字符串""是完全不同的数据类型。在JavaScript的隐式类型转换规则下,[] == ""会返回true,因此[] != ""的结果是false——这就导致你误以为能拦截的空数组,实际被跳过了判断。
2. 按索引赋值导致空占位
你通过newArr[i] = [...arr[i]]按索引给新数组赋值,当某个索引对应的子数组是空数组时,你跳过了赋值操作,这个位置就会留下undefined,最终数组里就出现了空占位(显示为, )。
修复方案
方案一:修正判断逻辑+用push避免空占位
保留你原有的遍历清空逻辑,修改判断条件为检查数组长度,同时用push方法添加元素(而非按索引赋值):
function filteredArray(arr, elem) { let newArr = []; for (let i=0; i<arr.length;i++){ for(let j=0;j<arr[i].length;j++){ if(arr[i][j] === elem){ // 用严格相等===避免隐式转换问题 arr[i].splice(0,arr[i].length); break; // 找到目标元素后直接跳出内层循环,提升效率 } } } for(let i=0; i<arr.length;i++){ if(arr[i].length > 0){ // 直接判断子数组长度是否大于0,准确可靠 newArr.push([...arr[i]]); } } return newArr; }
方案二:简化逻辑(推荐)
不需要修改原数组,直接过滤出不包含目标元素的子数组,代码更简洁高效:
function filteredArray(arr, elem) { const newArr = []; for (const subArr of arr) { if (!subArr.includes(elem)) { newArr.push([...subArr]); } } return newArr; }
方案三:用数组方法一行实现
如果喜欢更简洁的写法,可以结合filter和map:
function filteredArray(arr, elem) { return arr.filter(subArr => !subArr.includes(elem)).map(subArr => [...subArr]); }
以上三种方案都能正确处理测试用例,返回[ [ 'flutes', 4 ] ]。
内容的提问来源于stack exchange,提问作者user user
相关产品推荐
相关产品推荐

