如何按值升序排序以对象为键的JavaScript键值对?
如何按值升序排序以对象为键的JavaScript键值对集合?
首先得指出一个关键问题:你用普通 JavaScript 对象({})来存储以对象为键的键值对是行不通的——因为普通对象的键只能是字符串或 Symbol 类型,当你把对象作为键赋值时,JS 会自动把对象转成字符串 "[object Object]",所以你的 map2 实际上最后只会剩下一个键值对(最后赋值的 obj4: 40),前面的赋值全被覆盖了。
要实现你想要的效果,得改用 Map 来存储,因为 Map 原生支持对象作为唯一键,还能保留键的原始引用。下面是具体实现步骤:
步骤1:用Map替代普通对象存储键值对
先把你的存储结构改成 Map,这样每个对象键都能被正确识别:
const obj1 = new Object(); const obj2 = new Object(); const obj3 = new Object(); const obj4 = new Object(); // 改用Map存储,支持对象作为唯一键 const map2 = new Map(); map2.set(obj1, 10); map2.set(obj2, -20); map2.set(obj3, 0); map2.set(obj4, 40);
步骤2:将Map条目转为数组并排序
把 Map 的键值对(entries)转换成数组,然后用 Array.sort() 按值升序排序:
// 将Map的条目转为数组,然后按值从小到大排序 const sortedEntries = Array.from(map2.entries()).sort((entryA, entryB) => { // entryA[1]是第一个条目的值,entryB[1]是第二个条目的值 return entryA[1] - entryB[1]; });
步骤3:生成排序后的Map(可选)
如果需要保留Map结构,可以用排序后的数组创建一个新的 Map:
const sortedMap = new Map(sortedEntries); // 验证排序结果:遍历输出 sortedMap.forEach((value, key) => { console.log(`map2[${key}] = ${value}`); });
运行这段代码后,输出顺序会完全符合你的预期:
map2[obj2] = -20 map2[obj3] = 0 map2[obj1] = 10 map2[obj4] = 40
为什么普通对象做不到?
再强调一次:普通对象的键会被强制转换为字符串,所有对象作为键都会变成 "[object Object]",所以你的原始代码里,map2[obj1]、map2[obj2] 实际上都是在给同一个键赋值,最后只会保留最后一次的结果。只有 Map 才能真正保留对象作为键的唯一性和原始引用。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

