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

如何按值升序排序以对象为键的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:12:55