JavaScript Set及其應用 去重,交集,並集,差集


Set

之前學習了Set,好久沒用又忘了,現在復習一遍,做個記錄,方便以后查閱

先打印一下Set實例,看看里面都有些什么

Set類

Set類的構造函數是Set()本身,可以傳入參數對Set實例進行初始化,但是這個參數必須實現了Iterable接口,Array、Map、Set都實現了iterable接口。這意味着這三種類型都可以用於Set實例的初始化。

Set集合的特點

  • Set存儲的值唯一且不重復,可以用於去重
  • Set沒有鍵,因此keys/values都將返回相同的結果(一個setIterator,迭代器對象),可以用forof和forEach取值

關於Iterable

iterable,可迭代的。這是ES6引入的新類型,具有iterable類型的集合可以通過forin循環來遍歷

創建Set實例

分別用Array、Map、Set傳入構造實例化Set

createSet=(param)=>{
    return new Set(param)
}

//用數組實例化Set
let param1 = [1,2,3]
console.log(createSet(param1))//Set(3) {1, 2, 3}

//Map
let param2 = new Map().set('a',1).set('b',2)
console.log(createSet(param2))//Set(2) {Array(2), Array(2)}

//Set
let param3 = new Set([1,2,3]);
console.log(createSet(param3))//Set(3) {1, 2, 3}

Set API

  • size 返回Set存儲的值的個數

遍歷

  • keys()
  • values()
  • entries()
  • forEach()

增刪改查

  • add(value): 返回set自身
  • delete(value):刪除,返回布爾值
  • has(value):返回布爾值
  • clear():清除所有成員

遍歷

//遍歷set
let set = new Set([1, '1', '-1', -1, 'mmm'])
let setIterator = set.keys();
setIterator = set.values();
// setIterator = set.entries()//5個鍵值對數組,鍵和值相同
for (const value of setIterator) {
    console.log(value)
}
set.forEach((v,i) => {
    console.log(v,i)
});

增刪改查

//增,返回值是set
set.add('new1')
//刪,返回bool
set.delete('new1')
//是否存在,返回bool
console.log(set.has('new1'))
//清除全部,沒有返回值
set.clear()
console.log(set)

Set的應用,去重,交集,並集,差集

//測試用例
let a = [1, 2, 3, 4, 5]
let b = [3, 4, 5, 6, 7]

//去重
function distinct(arr) {
    return [...new Set(arr)]
}

//並集,講兩個數組分別結構到set的構造種
function merge(arr1, arr2) {
    return new Set([...arr1, ...arr2])
}

//交集
function unite(arr1, arr2) {
    return new Set([...arr1].filter(v=>arr2.some(v2=>v2===v)))
}

//差集,某個數組減去交集
function difference(arr1, arr2) {
    let un = merge(arr1,arr2)
    let itsct = unite(arr1, arr2);
    //整體差集
    return new Set([...un].filter(v=>!itsct.has(v)))
    //相對差集
    // return new Set([...arr1].filter(v => !itsct.has(v)))
}

console.log('distinction is ', distinct([1, 1, 1, 1, 1]))
console.log('merge is ', merge(a, b))
console.log('unite is ', unite(a, b));
console.log('difference is ',difference(b,a));


免責聲明!

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



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