如何使用JavaScript对二维数组进行数值降序排序?
搞定这个二维数组排序的方法来了!
看你的需求,是要把二维数组按第一个元素从大到小降序排列,而且当第一个元素相同时,第二个元素要按字母顺序升序(或者说保持原数组里的相对顺序,在你的例子里这俩结果是一致的)。
你之前用的compare(x, y) { return x - y; }其实是按升序排的,而且没明确针对二维数组的第一个元素做比较,所以达不到效果。我给你捋清楚怎么改:
核心逻辑拆解
- 优先按第一个元素降序:把比较逻辑反过来,用
y[0] - x[0],这样大的数会排到前面。这里一定要注意取子数组的第一个元素x[0]和y[0],你之前的函数没明确这一点,虽然巧合能转成数值,但逻辑不严谨。 - 第一个元素相等时处理第二个元素:看你的期望结果,第一个元素相同的子数组(比如两个
9、三个1)是按第二个元素的字母顺序排的,所以用x[1].localeCompare(y[1])来实现字母升序,这个方法比直接字符串对比更靠谱,还能处理多语言的情况。
直接能用的代码
const originalArr = [ [ 1, 'a' ], [ 2, 'b' ], [ 1, 'd' ], [ 9, 'e' ], [ 1, 'f' ], [ 11, 'g' ], [ 9, 'h' ], [ 3, 'i' ] ]; const sortedArr = originalArr.sort((x, y) => { // 先比第一个元素,降序 if (y[0] !== x[0]) { return y[0] - x[0]; } // 第一个元素一样,就按第二个元素的字母顺序升序 return x[1].localeCompare(y[1]); }); console.log(sortedArr); // 输出正好是你要的:[ [ 11, 'g' ], [ 9, 'e' ], [ 9, 'h' ], [ 3, 'i' ], [ 2, 'b' ], [ 1, 'a' ], [ 1, 'd' ], [ 1, 'f' ] ]
为啥之前的方法不行?
你之前的compare函数有两个问题:
- 没明确针对二维数组的第一个元素比较,直接
x - y会把整个子数组转成数值(比如[1, 'a']转成1),虽然这一步碰巧能比第一个元素,但逻辑不对,万一子数组第一个元素不是数字就会出问题。 x - y是升序逻辑,你要的是降序,所以得反过来用y[0] - x[0]。
额外小提示
现在主流浏览器的sort方法都是稳定排序了,也就是说如果第一个元素相同,会保持原数组里的顺序。所以如果你只是想保留原顺序,只写return y[0] - x[0]也能得到你要的结果,但加上第二个元素的比较会让代码更健壮,不管引擎怎么实现都能保证结果正确。
内容的提问来源于stack exchange,提问作者Charlotte
相关产品推荐
相关产品推荐

