说说常用的Set对象

144 阅读2分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。

Set

Set的概念

set的数据集合类似于数组,本身是一个构造函数,用来生成Set结构。

  • set值唯一,没有重复的值
  • 常用于去除重复的数据
  • key和value值相等
  • 在set内部,两个NaN相等,两个对象不相等

创建一个set

let set = new Set([1,2,"a",1,"a","b"]);
console.log(set); // 值是唯一的
console.log(...set);// 输出单个元素
console.log([...set]);// 输出数组
console.log([...set].join(''));// 去除字符串里面的重复字符
console.log(Array.from(set));// Array.from方法可以将 Set 结构转为数组。

交集,并集,差集

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
console.log(union);
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
console.log(intersect);
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
console.log(difference);

在遍历中改变set结构的2种方法

  • 扩展运算符(...)内部使用for...of循环
  • 数组的map和filter方法也可以间接用于 Set
// 方法一
let set1 = new Set([1, 2, 3]);
set1 = new Set([...set1].map(val => val * 2));
// set的值是2, 4, 6

// 方法二
let set2 = new Set([1, 2, 3]);
set2 = new Set(Array.from(set2, val => val * 2));
// set的值是2, 4, 6

set的属性

  • size set的长度
  • add 添加属性 可以用连缀的写法
  • delete 删除一个属性 不可以连缀 因为删除返回的是一个布尔值
  • has 判断 集合中是有有该属性
  • clear 清除set中的所有属性
set.add(5).add(6);  // 返回set本身  可以连缀
set.delete("a") ;  // 返回true或者false
set.has("a");   // 返回 true或者false
set.keys();   // 获取所有的keys
set.values();  // 获取所有的值
set.entries(); // 获取所有的键和值
set.forEach(function (value,key) {
   console.log("key "+key+"  value"+value)
});
set.clear();  //没有返回值、
console.log(set.size);

遍历操作

  • Set.prototype.keys():返回键名的遍历器
  • Set.prototype.values():返回键值的遍历器
  • Set.prototype.entries():返回键值对的遍历器
  • Set.prototype.forEach():使用回调函数遍历每个成员 keys方法、values方法、entries方法返回的都是遍历器对象。 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法返回的一致。
console.log(set.keys());
console.log(set.values())
set.forEach(function (keys,values) {
   console.log(keys + "keys----" + values + "values");
})

扩展运算符(...)内部使用for...of循环,所以也可以用于 Set 结构。

let set = new Set(['red', 'green', 'blue']);
let arr = [...set];
// ['red', 'green', 'blue']

数组的mapfilter方法也可以间接用于 Set 了

let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// 返回Set结构:{2, 4, 6}

let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0));
// 返回Set结构:{2, 4}

以上就是ES6中的Set结构了,使用好Set可以给我们带来极大的便利。减少更多的工作量。