如何按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
相关产品推荐
相关产品推荐

