如何在JavaScript中正确排序二维数对数组以匹配目标数组?
修正二维数对数组的排序逻辑
你当前的sort回调函数存在两个核心问题:
- 运算符优先级导致计算逻辑完全错误:
d[0] + d[1] - c[0] + c[1]的实际运算顺序是(d[0]+d[1]-c[0]) + c[1],既不是比较数对和的逻辑,也不符合数组a的排序规则。 - 排序规则不匹配目标数组
a:数组a的排序逻辑是先按数对第一个元素升序,第一个元素相同时再按第二个元素升序,而非按数对元素和排序。
修正后的代码
将sort回调替换为符合目标规则的逻辑即可:
const a = [ [1, 1], [1, 2], [1, 3], [5, 6] ] const b = [ [5, 6], [1, 2], [1, 3], [1, 1] ] // 修正后的排序逻辑:先比较第一个元素,再比较第二个元素 b.sort((c, d) => { if (c[0] !== d[0]) { return c[0] - d[0]; } return c[1] - d[1]; }); console.log(b); // 输出: [[1,1],[1,2],[1,3],[5,6]] function compare(a, b) { if (a.length != b.length) return false; for (let i = 0; i < b.length; i++) for (let j = 0; j < b[i].length; j++) if (a[i][j] !== b[i][j]) return false; return true; } console.log(compare(a, b)); // 输出: true
也可以简化为一行写法,逻辑完全一致:
b.sort((c, d) => c[0] - d[0] || c[1] - d[1]);
逻辑说明
- 当两个数对的第一个元素不同时,
c[0] - d[0]会返回负数或正数,实现按第一个元素升序排列; - 当第一个元素相同时,
c[0] - d[0]等于0,逻辑或||会执行后续的c[1] - d[1],实现按第二个元素升序排列。
这样排序后的数组b会与数组a完全一致,你的compare函数也会返回true。
内容的提问来源于stack exchange,提问作者codproe
相关产品推荐
相关产品推荐

