如何实现JavaScript对象按键名进行升序与降序排序
JavaScript对象按键名字母序排序实现方案
你当前编写的代码仅完成了键名提取与排序步骤,没有按排序后的键顺序回填对应属性值,因此只能拿到排序后的键名,无法获取键关联的password等属性内容。
ES6+规范中明确了对象键的遍历顺序,只要按排序后的键顺序重新组装新对象,就能得到符合排序要求的结构,完整保留所有属性值。
按键名字母升序排列
sort()方法默认按字符串Unicode编码顺序做升序排列,实现代码如下:
const Accounts = { 'thing': { password: '123', }, 'apple': { password: '456' }, 'zoo': { password: '789' } } // 提取键名并升序排序 const sortedAscKeys = Object.keys(Accounts).sort(); const sortedAscAccounts = {}; // 按排序后的键顺序回填属性值 sortedAscKeys.forEach(key => { sortedAscAccounts[key] = Accounts[key]; });
运行后sortedAscAccounts的键顺序为apple→thing→zoo,每个键对应的嵌套属性(如password)都会完整保留。
更简洁的现代写法可以直接用Object.entries配合Object.fromEntries实现:
const sortedAscAccounts = Object.fromEntries( Object.entries(Accounts).sort((a, b) => a[0].localeCompare(b[0])) );
其中localeCompare()方法专门用于字符串比较,相比直接比较字符串能更好兼容特殊字符、多语言场景的排序逻辑。
按键名字母降序排列
降序仅需要调整sort()的比较逻辑,反转比较顺序即可:
// 提取键名并降序排序 const sortedDescKeys = Object.keys(Accounts).sort((a, b) => b.localeCompare(a)); const sortedDescAccounts = {}; // 按排序后的键顺序回填属性值 sortedDescKeys.forEach(key => { sortedDescAccounts[key] = Accounts[key]; });
运行后sortedDescAccounts的键顺序为zoo→thing→apple,所有属性值完整保留。
对应的简洁写法:
const sortedDescAccounts = Object.fromEntries( Object.entries(Accounts).sort((a, b) => b[0].localeCompare(a[0])) );
注意事项
- 上述实现均通过组装新对象的方式得到排序结果,不会修改原始对象数据
- 无论属性值是基础类型还是嵌套对象、数组,都能完整保留
- 不推荐依赖旧版JS引擎(IE11及更早版本)的对象键顺序,这类环境没有统一的键遍历规范
内容的提问来源于stack exchange,提问作者ChillingCone426
相关产品推荐
相关产品推荐

