JavaScript中Array.sort按对象source属性排序未生效的原因
错误原因
代码排序没出现预期变化的核心问题是字段类型和比较规则不匹配:
- 数组中
source字段存的是字符串类型的数字,直接用>、<比较时,会按照字符串字典序逐位对比字符ASCII值排序,根本不会按数值大小计算顺序。 - 你当前的测试数据按字符串降序排列的结果,恰好和原数组顺序完全一致:字典序下
'64' > '61' > '114'(因为'1'的ASCII码比'6'小,只要第一位字符小,不管后面字符串多长,整个字符串判定为更小),所以排序后顺序没动,看起来就像代码没起作用。 - 额外提一句,嵌套三目写大小判断的写法冗余还容易出边界错误,数值排序没必要这么写。
修正方法
比较前先把source转成数字类型,用数值差值做比较逻辑即可,写法简洁不容易出错。
如果你要实现source数值从大到小降序排列(和你原本写的返回-1/1的逻辑方向一致),代码如下:
const arr = [ { source: '64', target: '63' }, { source: '61', target: '64' }, { source: '114', target: '63' }, ]; console.log('before', arr); // 转数字后做差值比较,降序为b减a,升序换为a减b即可 arr.sort((a, b) => Number(b.source) - Number(a.source)); console.log('after', arr);
执行后正确排序结果为:
{source: '114', target: '63'}(数值114最大,排最前){source: '64', target: '63'}(数值64次之){source: '61', target: '64'}(数值61最小,排最后)
如果需要从小到大升序排列,只需要把比较逻辑改成Number(a.source) - Number(b.source)就行。
内容的提问来源于stack exchange,提问作者Mike K
相关产品推荐
相关产品推荐

