iT邦幫忙

0

JavaScript的問題:如何尋找Map中最大的key

各位好

這個問題感覺應該很容易,但本人試了很久,也爬過一些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高手指點,謝謝

0
Han
iT邦新手 4 級 ‧ 2021-01-23 14:54:09

最大是指 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
ffaanngg iT邦新手 5 級 ‧ 2021-01-24 15:32:20 檢舉

謝謝,請問大大是有沒有推荐的文檔讓新手學習Map的操作? 我感覺JavaScript對Map的操作沒有寫得很清楚(加入Object之後又更複雜了)

Han iT邦新手 4 級 ‧ 2021-01-24 19:16:20 檢舉

我是都看官網介紹,還有常用就會了..

ffaanngg iT邦新手 5 級 ‧ 2021-01-25 14:00:18 檢舉

謝謝分享
不過我後來想了一下,覺得用Sort有些太慢,我只是要找最大的key
我再想想有沒有更好的做法

0
listennn08
iT邦高手 7 級 ‧ 2021-01-24 02:56:27

現在才發現完全跟 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 }
ffaanngg iT邦新手 5 級 ‧ 2021-01-24 15:30:04 檢舉

其實我是希望可以return 'b',不需要return {3,5}

我覺得JavaScript對map的操作有點複雜,請問各位都是看什麼文檔學習的?

ffaanngg

max(CharSetMap);

這個函式是會 return b 沒錯哦
等於 python 的這個 max(CharSet.keys())
所以 CharSetMap.get(key) 才能拿到 value

我覺得JavaScript對map的操作有點複雜,請問各位都是看什麼文檔學習的?

MDN 都有詳細的解釋

0
咖咖拉
iT邦研究生 4 級 ‧ 2021-01-24 13:15:48

這樣不知道通不通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);
看更多先前的回應...收起先前的回應...
ffaanngg iT邦新手 5 級 ‧ 2021-01-25 14:50:38 檢舉

要求"最大"的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'

咖咖拉 iT邦研究生 4 級 ‧ 2021-01-25 15:02:12 檢舉

你的"最大"是指最多的字數
一般不是都指最後一個嗎XD

最大的定義也沒有說清楚,是 ascii 加起來最大還是怎樣
他上面的 code 也只會比對第一個字而已/images/emoticon/emoticon06.gif

ffaanngg iT邦新手 5 級 ‧ 2021-01-28 01:52:42 檢舉

是由左到右比較每個字母的ascii沒錯
我不知道上面的code只會比對第一個字,感謝提醒

我要發表回答

立即登入回答