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

如何修复sort()排序失效?按对象name末尾数字排序对象数组

按对象name属性末尾数字升序排序数组的解决方法

你直接用sort()无效的原因是:

  • JavaScript数组默认的sort()方法会把元素转为字符串后按Unicode码点排序,但你的数组元素是对象,直接比较对象时只会对比引用地址,根本不会按name属性排序;
  • 就算是直接比较name字符串,默认排序也会按整个字符串的Unicode顺序,要是遇到数字位数不同的情况(比如"farm10"和"farm2"),默认字符串排序会把"farm10"排在"farm2"前面,因为"1"的Unicode码点比"2"小。

修正后的代码

要实现按name末尾数字升序排序,需要给sort()传入自定义比较函数,先提取每个对象name末尾的数字,转为数字类型后再比较:

const inje = [
  { name: "farm3", },
  { name: "farm1", },
  { name: "farm2", },
]

// 不修改原数组的写法(推荐)
const answer = [...inje].sort((a, b) => {
  // 提取name末尾的数字,转为Number类型
  const numA = Number(a.name.match(/\d+$/)[0]);
  const numB = Number(b.name.match(/\d+$/)[0]);
  // 升序排序:numA - numB,降序则反过来
  return numA - numB;
});

console.log(answer);

补充说明

  1. 正则提取数字:/\d+$/是匹配字符串末尾的连续数字,确保只提取name最后面的数字部分。
  2. 原地排序的注意点:如果直接用inje.sort(...),会修改原数组inje。如果需要保留原数组,用扩展运算符[...inje]或者inje.slice()先复制一份再排序。
  3. 兼容无数字的情况:如果部分对象的name末尾没有数字,可以加个兜底处理,避免报错:
const numA = a.name.match(/\d+$/) ? Number(a.name.match(/\d+$/)[0]) : 0;
const numB = b.name.match(/\d+$/) ? Number(b.name.match(/\d+$/)[0]) : 0;

内容的提问来源于stack exchange,提问作者user19476497

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:05:31