数组迭代处理后如何判断是否相等?我的JS函数返回结果异常
问题分析与修复方案
核心问题拆解
- 数组引用比较错误:你用
result === arr判断数组内容是否一致,但数组是引用类型,===只比较内存地址而非内容。你一开始就把原数组元素复制到了新的result数组,两者引用永远不同,导致找不存在的turtle时错误返回different。 - 循环提前退出无返回值:删除
bear时,执行splice后result.length减1,j递增后会提前不满足循环条件,直接退出循环,后续判断逻辑未执行,函数无返回值,输出undefined。
修复后的代码
let array = ['fox', 'tiger', 'elephant', 'jaguar', 'wolf', 'deer', 'hog', 'dhole', 'leopard', 'eagle', 'bear']; const splice = (arr, target) => { // 用扩展运算符简洁复制原数组 let result = [...arr]; let hasRemoved = false; let j = 0; while(j < result.length) { if (result[j] === target) { result.splice(j, 1); hasRemoved = true; // 删除元素后跳过j++,避免漏掉前移的下一个元素 continue; } j++; } // 循环结束后统一返回结果 return hasRemoved ? 'different' : 'equal'; }; // 正确返回'equal' console.log(splice(array, 'turtle')); // 正确返回'different' console.log(splice(array, 'bear'));
关键修复点
- 用
hasRemoved标记是否执行过删除操作,替代错误的引用比较,直接判断操作结果更高效准确。 - 删除元素后用
continue跳过j++,解决元素前移后漏遍历的问题。 - 循环结束后统一返回结果,确保函数始终有返回值。
如果确实需要对比两个数组内容是否一致,可以使用以下辅助函数:
function arraysAreEqual(a, b) { if (a.length !== b.length) return false; for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; }
之后用arraysAreEqual(result, arr)替代result === arr即可,但用hasRemoved标记的方式性能更优。
内容的提问来源于stack exchange,提问作者Emmanuel Balderas
相关产品推荐
相关产品推荐

