今天小編和大家一起探討一下引用型別中的map,在其中會有一些map與陣列聯合應用,還有和map類似的weakmap型別的說明,這篇文章同時也增加了一些運算元組的辦法和實際應用。大家也可以關注我的微信公眾號,蝸牛全棧。
一、map的宣告
let s = new Set([1,2,3]) console.log(s) // Set(3){1,2,3}
// map中的資料不會出現重複的情況,如果重複,會將重複的元素去掉。可以應用這一特性,對陣列進行去重等處理 let s = new Set([1,2,3,1]) console.log(s) // Set(3){1,2,3}
二、向map中新增元素:使用add方法
let s = new Set([1,2,3]) s.add("school") console.log(s) // Set(4){1,2,3,"school"}
// 可以通過鏈式新增,將元素新增到map中 let s = new Set([1,2,3]) s.add("school").add("bus") console.log(s) // Set(5){1,2,3,"school","bus"}
三、刪除map中的元素:使用delete方法
let s = new Set([1,2,3]) s.delete(2) console.log(s) // Set(2){1,3}
四、清空map內的全部元素:呼叫clear方法
let s = new Set([1,2,3]) s.clear() console.log(s) // Set(0){}
五、判斷map中是否含有某個元素:呼叫has方法
let s = new Set([1,2,3]) console.log(s.has(2)) // true
六、獲取map中元素個數:呼叫size
let s = new Set([1,2,3]) console.log(s.size) // 3
七、map的遍歷
let s = new Set([1,2,3]) s.forEach(item => console.log(item)) // 1 2 3 for(let item of s){ console.log(item) // 1 2 3 } for(let item of s.keys()){ console.log(item) // 1 2 3 } for(let item of s.values()){ console.log(item) // 1 2 3 } // 對於map,key和value是一樣的 for(let item of s.entries()){ console.log(item) // [1,1] [2,2] [3,3] }
八、實際應用
1、陣列去重
let arr = [1,2,3,3,3,2,1] let s = new Set(arr) console.log(s) // Set(3){1,2,3} console.log([...s]) // [1,2,3] console.log(Array.from(s)) // [1,2,3]
2、陣列合並後去重
let arr1 = [1,2,3,4] let arr2 = [2,3,4,5,6] let s = new Set([...arr1,...arr2]) console.log(s) // Set(6){1,2,3,4,5,6} console.log([...s]) // [1,2,3,4,5,6] console.log(Array.from(s)) // [1,2,3,4,5,6]
3、求兩個陣列的交集
let arr1 = [1,2,3,4] let arr2 = [2,3,4,5,6] let s1 = new Set(arr1) let s2 = new Set(arr2) let result = new Set(arr1.filter((item) => s2.has(item))) console.log(result) // Set(3){2,3,4}
4、求兩個陣列差集
let arr1 = [1,2,3,4] let arr2 = [2,3,4,5,6] let s1 = new Set(arr1) let s2 = new Set(arr2) let s3 = new Set(arr1.filter((item) => !s2.has(item))) let s4 = new Set(arr2.filter((item) => !s1.has(item))) console.log(s3) // Map(1){1} console.log(s4) // Map(1){5,6} console.log([...s3,...s4]) // [1,5,6]
九、WeakMap:裡面只能存放Object,不能存放其他資料型別
let ws = new WeakSet() // ws.add(1) // 報錯:因為1不是Object型別,不能新增到WeakMap中 ws.add({ name:"lilei" }) ws.add({ age:12 }) console.log(ws) // WeakSet{{...},{...}}
1、刪除物件
let ws = new WeakSet() // ws.add(1) // 報錯:Invalid value used in weak set ws.add({ name:"lilei" }) ws.add({ age:12 }) ws.delete({ name:"lilei" }) console.log(ws) // WeakSet{{...},{...}} 刪除之後沒有生效,因為物件是引用資料型別,新增物件的地址和刪除元素的地址不一致,導致不能刪除
let ws = new WeakSet() const obj1 = {name:"lilei"} const obj2 = {age:12} ws.add(obj1) ws.add(obj2) console.log(ws) // WeakSet{{...},{...}} ws.delete(obj1) console.log(ws) // WeakSet{{...}} // 已經刪除了{name:"lilei"}內容,主要就是因為物件屬於引用型別,直接在delete寫物件與前一個物件在堆記憶體中指向的不是同一個地址 console.log(ws.has(obj2)) // true 判斷內部是否含有obj2物件,與map相同,使用has函式
2、迴圈遍歷:js中不能對WeakMap型別資料進行迴圈遍歷,這個與垃圾回收(GC)有關,具體機制小編還不是很清楚,在今後的文章中會補上這一課。
let ws = new WeakSet() const obj1 = {name:"lilei"} const obj2 = {age:12} ws.add(obj1) ws.add(obj2) ws.forEach(item => console.log(item)) // 報錯:ws.forEach is not a function