◆

JavaScript Set 集合去重与实例方法详解

2023-02-02 01:370

什么是 Set

Set 类似于数组,但是成员的值都是唯一的,没有重复的值。

如下代码通过 Set 的 add 方法向 Set 中添加成员,最后会发现 Set 结构不会添加重复的值。

const s = new Set();

[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));

for (let i of s) {
  console.log(i);
}
// 2 3 5 4

初始化 Set

Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化

// 例一
const set = new Set([1, 2, 3, 4, 4]);
[...set];
// [1, 2, 3, 4]

// 例二
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size; // 5

// 例三
const set = new Set(document.querySelectorAll('div'));
set.size; // 11

// 类似于
const set = new Set();
document.querySelectorAll('div').forEach(div => set.add(div));
set.size; // 11

// 例四
[...new Set('wfly')]; // ['w', 'f', 'l', 'y']

利用 Set 结构去除字符串里面的重复字符

[...new Set('ababbc')].join(''); // "abc"

其他特殊数据

如下代码中有两个 NaN,两个 { a: 1 },0 与 -0

const set = new Set([{ a: 1 }, NaN, 0, 10, '10', -0, NaN, { a: 1 }]);
console.log(set);
set

通过如图所示结果,可以发现在 Set 内部,两个 NaN 是相等的,0 与 -0 是不相等的,对象是不相等的

实例属性

Set.prototype.constructor

构造函数,默认就是 Set 函数。

const set = new Set([{ a: 1 }, NaN, 0, 10, '10', -0, NaN, { a: 1 }]);
console.log(set.constructor); // ƒ Set() { [native code] }

Set.prototype.size

返回 Set 实例的成员总数。

const set = new Set([{ a: 1 }, NaN, 0, 10, '10', -0, NaN, { a: 1 }]);
console.log(set.size); // 6

实例方法

Set.prototype.add(value)

添加某个值,返回 Set 结构本身。

Set.prototype.delete(value)

删除某个值,返回一个布尔值,表示删除是否成功。

Set.prototype.has(value)

返回一个布尔值,表示该值是否为 Set 的成员。

Set.prototype.clear()

清除所有成员,没有返回值。

以上代码示例

const s = new Set();
const s_bak = s.add(1).add(2).add(2);
s_bak.add(3).add(4).add(5);

console.log(s); // {1, 2, 3, 4, 5}
console.log(s_bak); // {1, 2, 3, 4, 5}
console.log(s === s_bak); // true

s.has(2); // true
s.delete(2); // true
s.has(2); // false

s.delete(); // false
s.delete(1000); // false

s.clear();
s.size; // 0

Array.from 方法可以将 Set 结构转为数组。

const items = new Set([1, 2, 3, 4, 5]);
const array = Array.from(items);

Set.prototype.keys()

返回键名的遍历器

Set.prototype.values()

返回键值的遍历器

Set.prototype.entries()

返回键值对的遍历器

Set.prototype.forEach()

使用回调函数遍历每个成员

以上四种方法示例

const set = new Set([{ a: 1 }, NaN, 0, 10, '10', -0, NaN, { a: 1 }]);

console.log('keys:', set.keys());
console.log('values:', set.values());
console.log(set.keys() === set.values());
console.log('entries:', set.entries());

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

可以发现 values 与 keys 返回值是一样的,因为 Set 结构没有键名,只有键值(或者说键名和键值是同一个值)

set

Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的 values 方法。

Set.prototype[Symbol.iterator] === Set.prototype.values;

如何使用数组的方法

通过 Array.from 或者扩展运算符将 Set 数据结构转换为数组,然后就可以使用数组的方法了。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEJavaScript Set 集合去重与实例方法详解加载中