Set 结构数据

SetES6 中提供的新数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成 Set 数据结构。

const set = new Set();
set.add(1);
set.add(2);
set.add(2);
console.log(set.size); // 2
console.log([...set]); // [1, 2]

上面的代码可以看到,因为Set是没有重复值的,所以当添加两个2的时候只加进去一个2。这里size是Set实例的一个属性,返回Set实例的成员总数。

另外,Set还可以接受一个数组作为参数,用来初始化。

const setAarrray = new Set([1, 2, 2, "2", 3, 3, 4, 5, NaN, NaN, {}, {}]);
console.log([...setAarrray]); //[1, 2, "2" 3, 4, 5, NaN, {}, {}];

这个时候2和"2"都加进去了,是因为在Set内部判断两个值是否相等用的是全等"==="。有一点要注意的是,向 Set 加入值时认为NaN等于自身,而精确相等运算符认为NaN不等于自身。所以上面代码中,添加两个NaN时,加进去一个。上面添加两个空对象时都加进去了,说明两个空对象是不相等的。在Set内部认为,两个对象总是不等的。

Set实例有自己的方法,下面介绍一下它的方法:

  • Set.prototype.add(value):添加某个值,返回 Set 结构本身。
  • Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
  • Set.prototype.clear():清除所有成员,没有返回值。
 const set = new Set();
 set.add(1);
 set.add(2);
 console.log(set.size);  //2
 console.log(set.has(1)); //true
 console.log(set.has(2)); //true
 console.log(set.has('2')); //false
 set.delete(2);
 console.log(set.size); //1
 console.log(set.has(2)); //false

Set 结构的实例还有遍历操作,可以用于遍历成员。下面是遍历的四种方法

  • Set.prototype.keys():返回键名的遍历器
  • Set.prototype.values():返回键值的遍历器
  • Set.prototype.entries():返回键值对的遍历器
  • Set.prototype.forEach():使用回调函数遍历每个成员

keys方法、values方法、entries方法返回的都是遍历器对象。由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。下面代码中entries方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。

    const set = new Set(["a", "b", "c"]);
    for (let item of set.keys()) {
      console.log(item);
      // "a"
      // "b"
      // "c"
    }

    for (let item of set.values()) {
      console.log(item);
      // "a"
      // "b"
      // "c"
    }

    for (let item of set.entries()) {
      console.log(item);
      // ["a", "a"]
      // ["b", "b"]
      // ["c", "c"]
    }

还可以省略values方法,直接用for...of循环遍历 Set。

const set = new Set(["a", "b", "c"]);
for (let item of set) {
     console.log(item);
      // "a"
      // "b"
      // "c"
 }

Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。

const set = new Set(["a", "b", "c"]);
set.forEach((value, key) => {
      console.log(value + ":" + key);
      // a:a
      // b:b
      // c:c
});

Set可以进行数组和字符串的去重

  const array = [1, 2, 3, 4, 4, 3, 2, 3];
  const resultArray = [...new Set(array)];
  console.log(resultArray); // [1, 2, 3, 4]

  const str = 'abbbcc';
  const resultStr = [...new Set(str)].join('');
  console.log(resultStr); // "abc"

大概就是这些,如果想知道得更详细可以去查看ES6。地址 http://es6.ruanyifeng.com/#docs/set-map

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章