JavaScript如何按对象key的自然升序对属性进行正确排序?
JavaScript对象按键的自然顺序排序方案
问题根因
你当前的代码存在两个不符合需求的问题:
- 排序逻辑错误:sort回调中你提取的是属性值
a和b做比较,实际需要比较的是属性键 - 默认字符串排序是字典序:逐字符比较ASCII码,
Gp10里的字符1ASCII码小于Gp2里的字符2,所以会排在前面,不符合数字按数值大小比较的自然排序需求。
解决方案
方案1:通用自然排序(适配键前缀不固定的场景)
使用JS内置的Intl.Collator国际化比较API,开启numeric: true配置即可实现自然排序,无需手动解析键内容:
const sortable = Object.fromEntries( Object.entries(group).sort(([keyA], [keyB]) => new Intl.Collator('en', { numeric: true }).compare(keyA, keyB) ) ); console.log(sortable);
方案2:手动提取数字比较(适配键格式固定为Gp+数字的场景)
如果所有键的格式都是固定的Gp加数字,可以直接提取数字部分做数值比较,性能更高:
const sortable = Object.fromEntries( Object.entries(group).sort(([keyA], [keyB]) => { const numA = Number(keyA.replace('Gp', '')); const numB = Number(keyB.replace('Gp', '')); return numA - numB; }) ); console.log(sortable);
注意事项
ES6及以上规范中,对象的字符串类型键会按照插入顺序保存,上述方案生成的对象使用Object.keys、for...in、Object.entries等方法遍历时,都会符合预期的自然排序顺序。
内容的提问来源于stack exchange,提问作者ERI NUR SHOFA
相关产品推荐
相关产品推荐

