算法 - 集合
2021-03-03 本文已影响0人
羽晞yose
集合
- 一种无序且唯一的数据结构
- ES6中有集合,名为Set
- 集合的常用操作:去重、判断某元素是否在集合中、求交集
// 去重
const arr = [1, 1, 2, 2]
const arr2 = [...new Set(arr)] // [ 1, 2 ], 或者使用Array.from
// 判断元素是否在集合中
const set = new Set(arr)
const has = set.has(1) // true
// 求交集
const set2 = new Set([2, 3])
const set3 = new Set([...set].filter(item => set2.has(item))) // { 2 }
两个数组的交集
- 求交集且无序唯一
- 使用集合
const intersection = function(nums1, nums2) {
return Array.from(new Set(nums1)).filter(item => arr2.includes(item))
};
const arr1 = [1,2,2,1] // [4,9,5]
const arr2 = [1,2] // [9,4,9,8,4]
const res = intersection(arr1, arr2)
console.log(res)
前端与集合:使用ES6的Set
- 使用Set对象:new、add、delete、has、size
- 迭代Set:多种迭代方法、Set与Array互转、求交集/差集
// add
let set = new Set()
set.add(1)
set.add(1)
set.add(5)
set.add('some text')
const obj = {a: 1, b: '2'}
set.add(obj)
set.add({a: 1, b: '2'})
console.log(set) // Set { 1, 5, 'some text', { a: 1, b: '2' } }
// has
set.has(obj) // true
// delete
set.delete(5)
console.log(set) // Set { 1, 'some text', { a: 1, b: '2' }, { a: 1, b: '2' } }
console.log(set.size) // 4
for(let item of set.keys()) console.log(item) // 1, 'some text', { a: 1, b: '2' }, { a: 1, b: '2' }
for(let item of set.values()) console.log(item) // 1, 'some text', { a: 1, b: '2' }, { a: 1, b: '2' }
for(let [key, value] of set.entries()) console.log(key, value) // 懒得贴了,结果肯定是上面的双倍输出
// 转数组
const toArray = Array.from(set)
const toArray2 = [...set]
// 交集与差集
const set2 = new Set([1, 2, 3, 4])
const intersection = new Set([...set].filter(item => set2.has(item)))
const difference = new Set([...set].filter(item => !set2.has(item)))
console.log({'交集': intersection, '差集': difference})