JavaScript Set與Map數據結構詳細分析
Set
ES6提供了新的數據結構 Set(集合)。它類似于數組,但成員的值都是唯一的,集合實現了iterator接口,所以可以使用 [擴展運算符] 和 [for...of] 進行遍歷。
基本使用
添加新的元素
Set函數可以接受一個數組(或者具有iterable接口的其他數據結構)作為參數,用來初始化。
<script>
// 聲明一個 set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會自動去重
// 添加新的元素
console.log(s.add(6));
</script>
刪除元素
<script>
// 聲明一個 set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會自動去重
// 刪除元素
s.delete(1)
console.log(s);
</script>數組去重
<script>
let arr = [1,2,2,3,4,4,5,6]
let result = [...new Set(arr)]
console.log(result);// [1, 2, 3, 4, 5, 6]
</script>檢測
<script>
// 聲明一個 set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會自動去重
// 檢測
console.log(s.has(2));//true
</script>清空
<script>
// 聲明一個 set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會自動去重
// 清空
console.log(s.clear());//undefined
</script>遍歷
<script>
// 聲明一個 set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會自動去重
// 遍歷
for(let v of s){
console.log(v);//1,2,3,4,5
}
</script>交集
<script>
let arr = [1,2,3,4,4,5,4,3,1,2,6]
let arr2 = [3,4,5,1,4,7,8]
// 先去重,避免重復數字比較降低效率
let result = [...new Set(arr)].filter(item=>{
// 對arr2進行去重
let newarr2 = new Set(arr2)
if(newarr2.has(item)){
return true
}else{
return false
}
})
// 簡寫形式
// let result = [...new Set(arr)].filter(item=>new Set(arr2).has(item))
console.log(result);//[1, 3, 4, 5]
</script>并集
<script>
let arr = [1,2,3,4,4,5,4,3,1,2,6]
let arr2 = [3,4,5,1,4,7,8]
let union = [...new Set([...arr,...arr2])]
console.log(union);
</script>差集
<script>
let arr = [1,2,3,4,4,5,4,3,1,2,6]
let arr2 = [3,4,5,1,4,7,8]
// 差集是交集的逆運算,主體的不同決定結果的不同
let diff = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)))
console.log(diff);//[2, 6]
</script>遍歷操作
Set數據結構提供了四種遍歷方法,用于遍歷成員。
keys()、values()
由于 Set 結構鍵名和鍵值是同一個值,所以 keys 方法和 values 方法的行為完全一致,都是返回鍵名/值 。
<script>
let set = new Set(['red', 'green', 'blue',1]);
for (var item of set.keys()) {
console.log(item);
}
for (var item1 of set.values()) {
console.log(item1);
}
console.log(item === item1);//true
</script>entries()
entries方法返回的結果包括鍵名和鍵值,所以輸出的數組,其鍵名和鍵值完全相等。
<script>
let set = new Set(['red', 'green', 'blue',1]);
for (var item of set.entries()) {
console.log(item);
}
</script>
forEach()
forEach()方法用于對每個成員執(zhí)行某種操作,該方法參數就是一個處理函數,該函數的參數與數組的forEach一致。
<script>
let set = new Set(['red', 'green', 'blue',1]);
set.forEach((value,key)=>console.log(key +':'+value))
</script>
Map
ES6提供了 Map 數據結構,它類似于對象,也是鍵值對的集合。但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。Map也實現了 iterator 接口,所以可以使用 [擴展運算符] 和 [for...of] 進行遍歷。
基本使用
添加元素
<script>
// 聲明 Map
let m = new Map()
// 添加元素
m.set('world',4)
m.set('hello',function(){
console.log('abc');
})
let person = {
name:'張三'
}
m.set(person,[5,6,7])
console.log(m);
</script>因為為Map添加了三次元素,所以Map的長度為3。

刪除元素
<script>
// 聲明 Map
let m = new Map()
let person = function(){
console.log('hello world');
}
m.set(person,'HELLO WPRLD')
m.set('people',[1,2,3])
console.log(m);//Map(2)
// 刪除元素
m.delete('people')
console.log(m);//Map(1)
</script>獲取元素
get方法獲取key對應的鍵值,如果找不到key,返回undefned。
<script>
// 聲明 Map
let m = new Map()
// 獲取元素
let person = function(){
console.log('hello world');
}
m.set(person,'HELLO WPRLD')
console.log(m.get(person))//HELLO WPRLD
</script>檢測元素
has方法返回一個布爾值,用來檢測某個值是否在當前 Map 對象中。
<script>
// 聲明 Map
let m = new Map()
m.set('a',1)
m.set(2,'b')
m.set('c',3)
// 檢測鍵名是否存在
console.log(m.has(1));//false
console.log(m.has(2));//true
</script>清除元素
clear方法清除所有元素,沒有返回值。
<script>
// 聲明 Map
let m = new Map()
m.set('a',1)
m.set(2,'b')
m.set('c',3)
// 清除所有
m.clear()
console.log(m);//Map(0)
</script>Map的遍歷操作和上文的Set方法一致,這里不再講解。
到此這篇關于JavaScript Set與Map數據結構詳細分析的文章就介紹到這了,更多相關JS Set與Map內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Uniapp微信小程序實現全局事件監(jiān)聽并進行數據埋點的方法
niapp起源?uni-app是一個使用Vue.js開發(fā)所有前端應用的框架,下面這篇文章主要給大家介紹了關于Uniapp微信小程序實現全局事件監(jiān)聽并進行數據埋點的相關資料,需要的朋友可以參考下2022-11-11

