1. 功能介紹
Map
對象保存鍵值對,並且能夠記住鍵的原始插入順序。任何值(對象或者原始值) 都可以作為一個鍵或一個值,當有重復的key和newValue插入時,會覆蓋前面key對應的oldValue。
2. 基本使用
// 創建一個Map對象(當前舉例無參數,可以用特定的二維數組、其它Map對象作為參數) const map = new Map() // key、value值可以是任意類型 map.set("key1", "value1") map.set(NaN, "value2") map.set({}, "value3") // 通過key獲取相應的value map.get("key1") // "value1" map.get(NaN) // "value2" map.get({}) // undefined,因為此處的{} !== 前面的{} // 查找Map對象是否具有某key map.has("key1") // true map.has("key4") // false // 刪除某key-value map.delete("key1") // true 刪除成功 map.delete("key4") // false 不存在key="key4" // 使用for...of遍歷 // for (let [key, value] of map) { // console.log(key, value) // } // 使用forEach方法遍歷 map.forEach((value, key) => { //*****注意這里參數的順序 console.log(key, value) })
3. 算法鞏固
3.1 兩數之和
3.1.1 題目描述
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum
3.1.2 示例
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
3.1.3 解決方案
1. 暴力解決:通過雙重循環遍歷后續元素是否存在target-nums[i]的元素,此處不再贅述詳細步驟。
2. 使用Map對象:只循環一次,通過空間換取時間,每次遍歷判斷Map對象中是否存在當前遍歷元素,如果沒有找到,則將此次遍歷的目標元素通過Map存儲起來,思路有點繞,可以好好想一下:
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ var twoSum = (nums, target) => { // 創建HashMap對象 const map = new Map() for (let i = 0; i < nums.length; i++) { // 如果找到匹配的數,則返回 if (map.has(nums[i])) { return [map.get(nums[i]), i] } else { // 如果沒有找到,則將該位置對應需要找的數存儲起來 map.set(target - nums[i], i) } } }
3.2 數組去重
3.2.1 題目描述
數組中的元素不具備唯一性,往往會有相同的元素位於數組中不同位置的情況,現在需要設計一個算法,使數組中的數據唯一【不改變原數組的情況下,返回一個新數組】
3.2.2 示例
給定 nums = [2, 7, 11, 2, 15]
因為數組下標為0的元素和數組下標為3的元素重復
所以返回 [2, 7, 11, 15]
3.2.3 解決方案
其它方案,例如封裝方法、使用Set類等等方法暫時不討論,在此處,我們主要討論利用Map類如果添加相同的key和newValue會覆蓋前面key對應oldValue的這一特點,以原數組元素作為Map對象添加數據的key,原數組元素對應的下標作為Map對象添加數據的value,實現數組去重:
const nums = [2, 7, 11, 2, 15] // 創建一個Map對象用於數組去重 const map = new Map() // 循環遍歷nums,將數組元素和對應的下標添加到Map對象中 nums.forEach((value, index) => { map.set(value, index) }) // 注意map.keys()雖然可以遍歷(MapIterator),但不是數組 // 使用Array.from()方法將偽數組轉換成數組 const noReptNums = Array.from(map.keys()) // 打印輸出 console.log(noReptNums) // (4) [2, 7, 11, 15]
4. 參考文檔
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map