JavaScript Map操作:排序键值与获取值最大且字典序最大的键
问题解答
1. 如何在JavaScript的Map中对键和值进行排序?
Map本身会保留键的插入顺序,但如果需要按键或值自定义排序,需要先将Map转换为数组,排序后再重新构建Map:
按键排序
// 按字符串键的字典序升序排序 const sortedByKeyAsc = new Map( Array.from(originalMap.entries()).sort(([keyA], [keyB]) => { if (keyA < keyB) return -1; if (keyA > keyB) return 1; return 0; }) ); // 按数字键升序排序 const sortedByNumKeyAsc = new Map( Array.from(originalMap.entries()).sort(([keyA], [keyB]) => keyA - keyB) );
按值排序
// 按值升序排序 const sortedByValueAsc = new Map( Array.from(originalMap.entries()).sort(([, valA], [, valB]) => valA - valB) ); // 按值降序排序,值相同时按键的字典序降序排序 const sortedByValueDescThenKeyDesc = new Map( Array.from(originalMap.entries()).sort(([keyA, valA], [keyB, valB]) => { if (valB !== valA) { return valB - valA; // 值降序 } // 值相同时,键字典序降序 return keyB > keyA ? 1 : -1; }) );
2. 获取值最大且字典序最大的键
针对你的需求,在现有代码基础上,只需在计算出最大值max后,筛选出所有值等于max的键,再从中选出字典序最大的即可。修改后的完整代码如下:
var slowestKey = function(releaseTimes, keysPressed) { let map = new Map(); map.set(keysPressed[0], releaseTimes[0]); for(let i = 0; i < releaseTimes.length - 1; i++){ let time = releaseTimes[i+1] - releaseTimes[i]; map.set(keysPressed[i+1], time); } let max = Math.max(...map.values()); // 筛选出所有值等于max的键值对,再选出字典序最大的键 let result = ''; for (const [key, val] of map.entries()) { if (val === max) { if (key > result) { result = key; } } } return result; };
代码说明:
- 遍历Map的所有键值对,筛选出值等于
max的键; - 逐个比较这些键的字典序,保留最大的那个(JavaScript中字符串比较遵循Unicode编码顺序,字母的字典序与Unicode顺序一致)。
针对输入示例releaseTimes = [9,29,49,50], keysPressed = "cbcd",代码会筛选出'c'和'b'两个候选键,最终返回字典序更大的'c',符合期望输出。
内容的提问来源于stack exchange,提问作者Harsh Mishra
相关产品推荐
相关产品推荐

