JavaScript Set與Map數(shù)據(jù)結(jié)構(gòu)詳細(xì)分析
Set
ES6提供了新的數(shù)據(jù)結(jié)構(gòu) Set(集合)。它類似于數(shù)組,但成員的值都是唯一的,集合實(shí)現(xiàn)了iterator接口,所以可以使用 [擴(kuò)展運(yùn)算符] 和 [for...of] 進(jìn)行遍歷。
基本使用
添加新的元素
Set函數(shù)可以接受一個(gè)數(shù)組(或者具有iterable接口的其他數(shù)據(jù)結(jié)構(gòu))作為參數(shù),用來初始化。
<script>
// 聲明一個(gè) set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會(huì)自動(dòng)去重
// 添加新的元素
console.log(s.add(6));
</script>
刪除元素
<script>
// 聲明一個(gè) set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會(huì)自動(dòng)去重
// 刪除元素
s.delete(1)
console.log(s);
</script>數(shù)組去重
<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>
// 聲明一個(gè) set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會(huì)自動(dòng)去重
// 檢測
console.log(s.has(2));//true
</script>清空
<script>
// 聲明一個(gè) set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會(huì)自動(dòng)去重
// 清空
console.log(s.clear());//undefined
</script>遍歷
<script>
// 聲明一個(gè) set
let s = new Set([1,2,2,3,4,4,5]) //Set方法會(huì)自動(dòng)去重
// 遍歷
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]
// 先去重,避免重復(fù)數(shù)字比較降低效率
let result = [...new Set(arr)].filter(item=>{
// 對arr2進(jìn)行去重
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]
// 差集是交集的逆運(yùn)算,主體的不同決定結(jié)果的不同
let diff = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)))
console.log(diff);//[2, 6]
</script>遍歷操作
Set數(shù)據(jù)結(jié)構(gòu)提供了四種遍歷方法,用于遍歷成員。
keys()、values()
由于 Set 結(jié)構(gòu)鍵名和鍵值是同一個(gè)值,所以 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方法返回的結(jié)果包括鍵名和鍵值,所以輸出的數(shù)組,其鍵名和鍵值完全相等。
<script>
let set = new Set(['red', 'green', 'blue',1]);
for (var item of set.entries()) {
console.log(item);
}
</script>
forEach()
forEach()方法用于對每個(gè)成員執(zhí)行某種操作,該方法參數(shù)就是一個(gè)處理函數(shù),該函數(shù)的參數(shù)與數(shù)組的forEach一致。
<script>
let set = new Set(['red', 'green', 'blue',1]);
set.forEach((value,key)=>console.log(key +':'+value))
</script>
Map
ES6提供了 Map 數(shù)據(jù)結(jié)構(gòu),它類似于對象,也是鍵值對的集合。但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當(dāng)作鍵。Map也實(shí)現(xiàn)了 iterator 接口,所以可以使用 [擴(kuò)展運(yùn)算符] 和 [for...of] 進(jìn)行遍歷。
基本使用
添加元素
<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>因?yàn)闉镸ap添加了三次元素,所以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對應(yīng)的鍵值,如果找不到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方法返回一個(gè)布爾值,用來檢測某個(gè)值是否在當(dāng)前 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方法一致,這里不再講解。
到此這篇關(guān)于JavaScript Set與Map數(shù)據(jù)結(jié)構(gòu)詳細(xì)分析的文章就介紹到這了,更多相關(guān)JS Set與Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript獲取select標(biāo)簽選中的值
這篇文章主要介紹javascript獲取select標(biāo)簽選中的值方法,比較實(shí)用,需要的朋友可以參考下。2016-06-06
Uniapp微信小程序?qū)崿F(xiàn)全局事件監(jiān)聽并進(jìn)行數(shù)據(jù)埋點(diǎn)的方法
niapp起源?uni-app是一個(gè)使用Vue.js開發(fā)所有前端應(yīng)用的框架,下面這篇文章主要給大家介紹了關(guān)于Uniapp微信小程序?qū)崿F(xiàn)全局事件監(jiān)聽并進(jìn)行數(shù)據(jù)埋點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-11-11
JS基于onclick事件實(shí)現(xiàn)單個(gè)按鈕的編輯與保存功能示例
這篇文章主要介紹了JS基于onclick事件實(shí)現(xiàn)單個(gè)按鈕的編輯與保存功能,結(jié)合實(shí)例形式分析了JS實(shí)現(xiàn)onclick響應(yīng)事件的轉(zhuǎn)換相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Javascript實(shí)現(xiàn)獲取及設(shè)置光標(biāo)位置的方法
這篇文章主要介紹了Javascript實(shí)現(xiàn)獲取及設(shè)置光標(biāo)位置的方法,涉及javascript針對頁面光標(biāo)位置的相關(guān)操作技巧,具有良好的兼容性,非常簡單實(shí)用,需要的朋友可以參考下2015-07-07

