Javascript set結構 (去重)
阿新 • • 發佈:2019-01-06
javascript 的set結構用來去重非常方便,這裡記錄一下。
1 背景
最近遇到問題,要記錄某個人曾經用過的手機和作業系統記錄到一個json
{
"os":["android","ios"],
"android":["mi8","p20"],
"ios":["iphone8","iphonex"]
}
而每個手機的源資料格式是這樣的:
{
"os" :"android"
"eq":"mi8"
}
這裡不希望記錄進去重複的型號和重複的作業系統。
用陣列自己去判斷是否重複太過於複雜,這裡就記得曾經瞭解過JavaScript中有set資料結構。
2 set資料結構
Set是一種類似於Map的資料結構,也是一組key的集合,但不儲存value。由於key不能重複,所以,在Set中,沒有重複的key,這種特性就起到資料去重的效果,重複的資料不會被寫入到set中。
2.1 set建立
let sets = new Set();//建立一個空的SET Set {}
let sets1 = new Set([1,2,3,4]);//可以傳入陣列-陣列轉set Set { 1, 2, 3, 4 }
let sets2 = new Set([1,2,2,4]);//重複資料不會新增到set中 Set { 1, 2, 4 }
可以利用建構函式可以傳入陣列的特性,用來給陣列去重。即第三種示例。
TODO:但這裡沒有考慮效能問題,比如較大的陣列用這種方式去重會有什麼結果。
2.2 set 加入或刪除key操作
Set 提供了add 和delete方法
sets.add(1,2,5);//Set { 1 } 只能加入第一個
sets.add(5);//Set { 1, 5 } 加入一個key(5)
sets.add(5);//Set { 1, 5 } 重複加入無效
sets.delete(1);//Set { 5 } 刪除一個key(5)
sets.delete(1);//Set { 5 } 重複刪除無效
2.3 set轉陣列
let array = Array.from(sets1);//[ 1, 2, 3, 4 ] 使用Array 提供的from方法
msgId = Array. from(new Set(msgId));//陣列去重