You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:27:20