各位好
這個問題感覺應該很容易,但本人試了很久,也爬過一些stackoverflow的文,都沒有試出來
對於一個叫CharSet的Map (Python中稱dictionary),以下的python代碼可找到"最大"的key
CharSet[max(CharSet.keys())]
但在JS裡不知要如何實現類似的功能...
假設名為CharSet的Map是: Map(1) { 'a' => Set(1) { 2 } , 'b' => Set(2) { 3,5 } }
本人希望可以得到'b'
但嘗試使用
Math.max(...Object.keys(CharSet))
Math.max(...CharSet.keys())
都無法得到我要的答案
麻煩JS高手指點,謝謝
最大是指 ascii 最大? 因為看你舉的例子不是數字
let obj = {a:[1,2,3], b:[3,4]};
let [maxKey] = Object.keys(obj).sort((a, b) => b.localeCompare(a));
console.log(maxKey); // b
現在才發現完全跟 value 沒關係 那我下面的答案完全沒用
找最大值的時間複雜度最少是O(n) 沒有更快的方法了
const max = (arr) => {
return arr.reduce((pre, cur) => {
let preC = pre.charCodeAt();
let curC = cur.charCodeAt();
if (pre.length > 1) preC = pre.split('').reduce((acc, s) => acc + s.charCodeAt(), 0)
if (cur.length > 1) curC = cur.split('').reduce((acc, s) => acc + s.charCodeAt(), 0);
return (preC > curC ? pre : cur);
}, '');
}
如果是想實現跟 python 一樣的功能
我測試了一下如果 Map 資料為
Map {
'a' => Set(1) { 2 } ,
'b' => Set(2) { 3,5 } ,
'c' => Set(2) { 2,5 }
}
那你上面 python 語法出來的結果會為 c
依照這個邏輯下去寫
在 JavaScript 要自己寫函數去實現,這邊先不考慮效能
const max = (map) => {
const mapToArr = [...map.entries()];
const maxNum = Math.max(...mapToArr.map((el) => [...el[1]]).flat());
return mapToArr.filter((el) => el[1].has(maxNum)).reverse()[0][0];
}
const CharSetMap = new Map([
['a', new Set([2])],
['b', new Set([3, 5])]
]);
console.log(CharSetMap.get(max(CharSetMap)));
// Set { 3, 5 }
這樣不知道通不通XD
const CharSetMap = new Map([
['a', new Set([2])],
['c', new Set([2])],
['er', new Set([2])],
['s', new Set([2])],
['k', new Set([2])],
['aa', new Set([2])],
['ww', new Set([2])],
['e', new Set([2])],
['b', new Set([3, 5])]
]);
let keyss = Array.from(CharSetMap.keys())[CharSetMap.size - 1];
console.log(keyss);
要求"最大"的key喔,我後來想到一個使用reduce函數的方法
let keyss = Array.from(CharSetMap.keys())
maxkey = keyss.reduce((max, item)=>{
let maxc = max.charCodeAt();
let itemc = item.charCodeAt();
return max = (maxc > itemc)? max:item;
},'')
console.log(maxkey); // 'ww'