ES6带键的集合——Set

62 min read

  Set对象可以存储任何类型的唯一值,无论是原始值或者对象引用。

  Set对象是值的集合,你可以按照插入的顺序迭代它的元素。Set中的元素只会出现一次,即Set中的元素是唯一的。

let set = new Set();
set.add('staven');
set.add(1);
set.add({name: 'Tom'});

属性

属性 描述
size 返回Set对象中值的个数。
console.log(set.size); // 3

方法

方法 描述
add(value) 向Set对象内添加一个元素。返回该Set对象。
delete(value) 删除Set一个元素,如果该元素存在返回true,否则返回false。
has(value) 如果值在Set中存在,则返回true,否则返回false。
clear() 清空Set
keys() 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的。
values() 与Set.keys()作用相同
entries() 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组。为了使这个方法和Map对象保持相似, 每个值的键和值相等。
forEach(cb, thisArg) 按照插入顺序,为Set对象中的每一个值调用一次cb。如果提供了thisArg参数,回调中的this会是这个参数。
console.log(set.has('staven')); // true
set.delete('staven');
set.clear();

特性

等值判断

  NaN和undefined都可以被存储在Set中,NaN之间、-0、+0被认为是相同的。

唯一性

  同一个值重复调用set.add(value)无效,Set里的值都只会出现一次。

Set迭代

  Set对象的迭代的顺序与插入值的顺序相同。

  • set.keys()
  • set.values()
  • set.entries()
  • for...of
  • forEach
for (let val of set.keys()) {
  console.log(val);
}

for (let val of set.values()) {
  console.log(val);
}

for (let [val, val] of set.entries()) {
  console.log(val);
}

for (let [val, val] of set) {
  console.log(val);
}

set.forEach((value, value, set) => {
  console.log(value);
})

使用案例

  • 数组去重
function unique(arr) {
  return Array.from(new Set(arr));
}
  • 超集

  如果一个集合b中的每一个元素都在集合a中,则集合a就是b的一个超集

function isSuperset(a, b) {
  for (let item of b) {
    if (!a.has(item)) {
      return false;
    }
  }
  return true;
}
  • 并集
function union(a, b) {
  let _union = new Set(a);
  for (let item of b) {
    _union.add(b);
  }
  return _union;
}

// or
function union(a, b) {
  return new Set([...a, ...b]);
}
  • 交集
function intersection(a, b) {
  let _intersection = new Set();
  for (let item of b) {
   if (a.has(item)) {
     _intersection.add(item);
   }
  }
  return _intersection;
}

// or
function intersection(a, b) {
  return new Set([...a].filter(x => b.has(x)));
}
  • 差集
function difference(a, b) {
  let _difference = new Set(a);
  for (let item of b) {
     _difference.delete(item);
  }
  return _difference;
}

// or
function difference(a, b) {
  return new Set([...a].filter(x => !b.has(x)));
}
  • 补集
function symmetricDifference(a, b) {
  let _difference = new Set(a);
  for (let item of b) {
   if (_difference.has(item)) {
     _difference.delete(item);
   } else {
     _difference.add(item);
   }
  }
  return _difference;
}