ES6之set集合
set集合
const s=new Set([1,2,3,4,2,6,7,4,5,1])
s.add(1)//无效
s.add(+0)
s.add(-0)//无效
console.log(s)
s.forEach((item,i,s)=>{
console.log(item,i,s)
})
const arr=[...s]
console.log(arr)
const s2=new Set("asdfasdfasdf")
const str=[...s2].join("")
console.log(str)
Set 是新出的一种集合类型,可以保证集合中的数据没有重复。可以直接 new 一个 Set 构造函数来创建一个 set 集合。这个集合是一个可迭代对象,传入的数据也必须是可迭代对象。所以将一个数组传入 set 里面,想要还原成数组,就可以直接使用展开运算符,展开成数组。如果是对象,则先转换成数组,在使用 join("") 进行拼接。
传入的数据会类似于可迭代对象,将每一次迭代的结果放入 set 集合中。所以 set 集合也可以使用 for-of 循环,同时内部还有一个 forEach 方法。类似于数组中的方法,只是由于 set 集合中缺失索引,索引是数组中特有的,所以 forEach 中的第二个参数和第一个参数一样,都是迭代的每一项。
set 集合中有 add ,has ,delete ,clear 方法和 size 属性。它们都是基于 Object.is 来进行重复判断。只是在进行 +0 和 -0 判断时两种情况保持一致,需要注意。
set 应用
const arr1 = [1, 2, 3, 4, 5, 2, 5]
const arr2 = [4, 5, 6, 7, 8, 9, 6, 7, 5]
// 并集
// const union=[...new Set(arr1.concat(arr2))]
const union = [...new Set([...arr1, ...arr2])]
console.log('并集', union)
// 交集
const intersection = [...new Set(arr1)].filter(item => arr2.indexOf(item) >= 0)
console.log('交集', intersection)
// 差集
// const difference = union.filter(item => arr1.indexOf(item) < 0 && arr2.indexOf(item) >= 0 || arr2.indexOf(item) < 0 && arr1.indexOf(item) >= 0)
const difference=union.filter(item=>intersection.indexOf(item)<0)
console.log('差集', difference)
要求得到两个数组的并集,交集,差集的新数组,并且不能出现重复项。可以使用 set 集合。求并集时可以将数组展开或使用 concat 方法。求交集时可以通过数组筛选结合 indexOf 方法,找出 arr2 包含 arr1 的元素。求差集可以直接用并集减去交集,也可以在并集中寻找属于一个数组而不属于另一个数组的结果。