JavaScript Set 和 WeakSet

JavaScript ES6 引入了两种新的数据结构,即 SetWeakSet

Set 类似于一个 数组,可以存储多个项目,如 数字字符串对象 等。然而,与数组不同的是,set 不能包含重复的值。


创建 JavaScript Set

要创建一个 Set,你需要使用 new Set() 构造函数。例如,

// create Set
const set1 = new Set(); // an empty set
console.log(set1); // Set {}

// Set with multiple types of value
const set2 = new Set([1, 'hello', {count : true}]);
console.log(set2); // Set {1, "hello", {count: true}}

当传递重复值给 Set 对象时,重复的值将被排除。

// Set with duplicate values
const set3 = new Set([1, 1, 2, 2]);
console.log(set3); // Set {1, 2}

访问 Set 元素

你可以使用 values() 方法访问 Set 元素,并使用 has() 方法检查 Set 中是否存在某个元素。例如,

const set1 = new Set([1, 2, 3]);

// access the elements of a Set
console.log(set1.values()); // Set Iterator [1, 2, 3]

你可以使用 has() 方法检查元素是否在 Set 中。例如,

const set1 = new Set([1, 2, 3]);

// check if an element is in Set
console.log(set1.has(1));

添加新元素

你可以使用 add() 方法向 Set 添加元素。例如,

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

// adding new elements
set.add(3);
console.log(set.values());

// adding duplicate elements
// does not add to Set
set.add(1);
console.log(set.values());

输出

Set Iterator [1, 2]
Set Iterator [1, 2, 3]
Set Iterator [1, 2, 3]

删除元素

你可以使用 clear()delete() 方法从 Set 中删除元素。

delete() 方法从 Set 中删除特定元素。例如,

const set = new Set([1, 2, 3]);
console.log(set.values()); // Set Iterator [1, 2, 3]

// removing a particular element
set.delete(2);
console.log(set.values()); // Set Iterator [1, 3]

clear() 方法从 Set 中删除所有元素。例如,

const set = new Set([1, 2, 3]);
console.log(set.values()); // Set Iterator [1, 2, 3]

// remove all elements of Set
set.clear();
console.log(set.values()); // Set Iterator []

迭代 Sets

你可以使用 for...of 循环或 forEach() 方法迭代 Set 元素。元素按插入顺序访问。例如,

const set = new Set([1, 2, 3]);

// looping through Set
for (let i of set) {
    console.log(i);
}

输出

1
2
3

JavaScript WeakSet

WeakSet 类似于 Set。然而,WeakSet 只能包含对象,而 Set 可以包含任何数据类型,如字符串、数字、对象等。例如,

const weakSet = new WeakSet();
console.log(weakSet); // WeakSet {}

let obj = {
    message: 'Hi',
    sendMessage: true
}

// adding object (element) to WeakSet
weakSet.add(obj);

console.log(weakSet); // WeakSet {{message: "Hi", sendMessage: true}}

当你尝试添加对象以外的其他数据类型时,WeakSet 会抛出错误。例如,

// trying to add string to WeakSet
weakSet.add('hello');

// throws error
// TypeError: Attempted to add a non-object key to a WeakSet
console.log(weakSet);

WeakSet 方法

WeakSets 具有 add()delete()has() 方法。例如,

const weakSet = new WeakSet();
console.log(weakSet); // WeakSet {}

const obj = {a:1};

// add to a weakSet
weakSet.add(obj);
console.log(weakSet); // WeakSet {{a: 1}}

// check if an element is in Set
console.log(weakSet.has(obj)); // true

// delete elements
weakSet.delete(obj);
console.log(weakSet); // WeakSet {}

WeakSets 不可迭代

与 Sets 不同,WeakSets 不可迭代。例如,

const weakSet = new WeakSet({a:1});

// looping through WeakSet
for (let i of weakSet) {

    // TypeError
    console.log(i);
}

数学集合运算

在 JavaScript 中,Set 不提供内置方法来执行并集、交集、差集等数学运算。但是,我们可以编写程序来执行这些运算。

示例:Set 并集运算

// perform union operation
// contain elements of both sets
function union(a, b) {
    let unionSet = new Set(a);
    for (let i of b) {
        unionSet.add(i);
    }
    return unionSet
}

// two sets of fruits
let setA = new Set(['apple', 'mango', 'orange']);
let setB = new Set(['grapes', 'apple', 'banana']);

let result = union(setA, setB);

console.log(result);

输出

Set {"apple", "mango", "orange", "grapes", "banana"}

示例:Set 交集运算

// perform intersection operation
// elements of set a that are also in set b
function intersection(setA, setB) {
    let intersectionSet = new Set();

    for (let i of setB) {
        if (setA.has(i)) {
            intersectionSet.add(i);
        }
    }
    return intersectionSet;
}

// two sets of fruits
let setA = new Set(['apple', 'mango', 'orange']);
let setB = new Set(['grapes', 'apple', 'banana']);

let result = intersection(setA, setB);

console.log(result);

输出

Set {"apple"}

示例:Set 差集运算

// perform difference operation
// elements of set a that are not in set b
function difference(setA, setB) {
    let differenceSet = new Set(setA)
    for (let i of setB) {
        differenceSet.delete(i)
    }
    return differenceSet
}

// two sets of fruits
let setA = new Set(['apple', 'mango', 'orange']);
let setB = new Set(['grapes', 'apple', 'banana']);

let result = difference(setA, setB);

console.log(result);

输出

Set {"mango", "orange"}

示例:Set 子集运算

// perform subset operation
// true if all elements of set b is in set a
function subset(setA, setB) {
    for (let i of setB) {
        if (!setA.has(i)) {
            return false
        }
    }
    return true
}

// two sets of fruits
let setA = new Set(['apple', 'mango', 'orange']);
let setB = new Set(['apple', 'orange']);

let result = subset(setA, setB);

console.log(result);

输出

true

JavaScript SetsWeakSetsES6 中引入。某些浏览器可能不支持它们。要了解更多信息,请访问 JavaScript Sets 支持JavaScript WeakSets 支持


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战