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

如何按Map值的price属性排序并保留键(JS/TS)

解决Map按值的price字段排序的问题

嘿,我完全懂你碰到的困扰——其实Map.entries()是完全能用的,只是你需要先把它转换成数组来利用数组的sort方法,这样既不会丢失键(汽车型号),又能按price排序!

核心思路

Map的entries()方法返回一个键值对迭代器,你可以用扩展运算符...或者Array.from()把它转成二维数组,每个元素的结构是[型号, {year: number, price: number}]。之后就可以用数组的sort方法,根据每个元素里value的price字段来排序,最后还能转回Map(如果需要的话)。

具体实现代码

1. 升序排序

// 把Map转成数组并按price升序排序
const sortedAsc = [...cars.entries()].sort((entryA, entryB) => {
  // entryA[1]是第一个条目的value对象,entryB[1]是第二个的
  return entryA[1].price - entryB[1].price;
});

// 如果需要转回排序后的Map
const sortedCarsAsc = new Map(sortedAsc);

2. 降序排序

只需要把sort的比较逻辑反过来就行:

// 按price降序排序
const sortedDesc = [...cars.entries()].sort((entryA, entryB) => {
  return entryB[1].price - entryA[1].price;
});

// 转回Map
const sortedCarsDesc = new Map(sortedDesc);

完整示例

这里给你一个可运行的完整例子,方便你参考:

// 初始化你的Map
const cars = new Map<string, { year: number; price: number }>([
  ["Model 3", { year: 2022, price: 42000 }],
  ["Model Y", { year: 2023, price: 48000 }],
  ["Model S", { year: 2021, price: 79000 }],
  ["Model X", { year: 2022, price: 84000 }],
]);

// 升序排序后的Map
const sortedByPriceAsc = new Map(
  [...cars.entries()].sort((a, b) => a[1].price - b[1].price)
);

// 降序排序后的Map
const sortedByPriceDesc = new Map(
  [...cars.entries()].sort((a, b) => b[1].price - a[1].price)
);

// 打印验证结果
console.log("=== 按价格升序 ===");
sortedByPriceAsc.forEach((val, key) => {
  console.log(`${key}:${val.year}款,${val.price}元`);
});

console.log("\n=== 按价格降序 ===");
sortedByPriceDesc.forEach((val, key) => {
  console.log(`${key}:${val.year}款,${val.price}元`);
});

补充说明

  • 如果你担心price可能是字符串类型(比如带货币符号),记得先转成数字再比较,比如parseFloat(entryA[1].price) - parseFloat(entryB[1].price)
  • 排序后的数组如果不需要转回Map,直接遍历数组就行,每个元素都保留了型号和对应的year/price信息

内容的提问来源于stack exchange,提问作者LostCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:29:48