如何将带有for循环的JavaScript数组比较函数转换为单行箭头函数
如何将数组比较函数转换为单行箭头函数?
首先来看你给出的原始数组比较函数:
function cmp_arrs(a, b) { if (a === b) return true; if (a.length != b.length) return false; for (let i=0; i < a.length; i++) if (a[i] != b[i]) return false; return true; }
你已经写出了部分单行箭头函数的代码,想替换掉<forLoop?>的部分,而且不想用粗糙的字符串化对比方法——这个想法非常对,因为字符串化的方式确实有很多严谨性问题,比如[1, "2"]和[1, 2]的toString()结果都是"1,2",但这两个数组实际并不相等;再比如包含对象或稀疏数组的场景,字符串化更是容易误判。
正确的单行箭头函数实现
最贴合原始函数逻辑且严谨的方式,是使用数组的every()方法来替代for循环,它会逐个验证数组元素的条件,完全匹配原始函数的遍历对比逻辑:
const cmp_arrs2 = (a, b) => a === b || (a.length === b.length && a.every((val, idx) => val === b[idx]))
为什么这个方案靠谱?
- 和原始函数逻辑完全一致:先判断两个数组是否是同一个引用(
a === b),再判断长度是否相等,最后逐个对比对应索引的元素 every()方法会遍历a的每一个元素,用当前元素和b对应索引的元素做全等对比,只要有一个元素不匹配就返回false,全部匹配则返回true- 因为前面已经判断了
a.length === b.length,所以不用担心b的索引越界问题,对比过程安全可靠
再说说字符串化方法的问题
你之前尝试的字符串化对比确实不够严谨,常见的坑包括:
- 类型不同但字符串化结果相同:比如
[1, "2"]vs[1, 2] - 稀疏数组和含空值的数组混淆:比如
[null, undefined]vs[,,] - 对象数组无法区分:任何对象的
toString()结果都是"[object Object]",导致不同的对象数组会被误判为相等
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

