js Map


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM