如何修复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);
补充说明
- 正则提取数字:
/\d+$/是匹配字符串末尾的连续数字,确保只提取name最后面的数字部分。 - 原地排序的注意点:如果直接用
inje.sort(...),会修改原数组inje。如果需要保留原数组,用扩展运算符[...inje]或者inje.slice()先复制一份再排序。 - 兼容无数字的情况:如果部分对象的
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
相关产品推荐
相关产品推荐

