ES6 - Set/WeakSet对象

ES6 - Set/WeakSet对象 首页 / ES6入门教程 / ES6 - Set/WeakSet对象

JavaScript ES6 引入了两个新的数据结构,即 Set WeakSet

Set类似于数组,它允许无涯教程存储数字,字符串,对象等多个项目。但是,与数组不同,Set不能包含重复值。

创建Set

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

// 创建集合
const set1 = new Set();//an empty set
console.log(set1);//Set {}

// 设置多种类型的值
const set2 = new Set([1, 'hello', {count : true}]);
console.log(set2);//Set {1, "hello", {count: true}}

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

// 设置重复值
const set3 = new Set([1, 1, 2, 2]);
console.log(set3);//Set {1, 2}

访问元素

您可以使用 values()方法访问 Set 元素,并使用has() 检查 Set 中是否有元素。例如,

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

// 访问 Set 的元素
console.log(set1.values());//Set Iterator [1, 2, 3]

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

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

// 检查元素是否在 Set 中
console.log(set1.has(1));

添加新元素

您可以使用 add()方法将元素添加到Set中。例如,

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

// 添加新元素
set.add(3);
console.log(set.values());

// 添加重复元素
// 不添加到 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]

// 删除特定元素
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]

// 删除 Set 的所有元素
set.clear();
console.log(set.values());//Set Iterator []

迭代Set

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

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

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

输出

1
2
3

WeakSet

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

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

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

// 将对象(元素)添加到 WeakSet
weakSet.add(obj);

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

当您尝试添加除对象之外的其他数据类型时,WeakSet会引发错误。例如,

// 试图将字符串添加到 WeakSet
weakSet.add('hello');

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

WeakSet方法

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

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

const obj = {a:1};

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

// 检查元素是否在 Set 中
console.log(weakSet.has(obj));//true

// 删除元素
weakSet.delete(obj);
console.log(weakSet);//WeakSet {}

WeakSet不可迭代

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

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

// 循环通过 WeakSet
for (let i of weakSet) {

   //TypeError
    console.log(i);
}

数学集合运算

在JavaScript中,Set不提供用于执行数学运算(例如并集,交集,差等)的内置方法。但是,无涯教程可以创建程序来执行这些运算。

示例:Set Union操作

// 执行union操作
// 包含两个集合的元素
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 Intersection操作

// 执行交叉操作
// 集合 a 中也在集合 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 Difference运算

// 进行差分运算
//集合 a 中不在集合 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 subset操作

// 执行子集操作
// 如果集合 b 的所有元素都在集合 a 中,则为 true
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 SetsWeakSets ES6 中引入某些浏览器可能不支持其使用。要了解更多信息请访问 JavaScript Set 支持 JavaScript WeakSet支持

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

硅谷产品实战36讲 -〔曲晓音〕

iOS开发高手课 -〔戴铭〕

深入拆解Tomcat & Jetty -〔李号双〕

Kafka核心技术与实战 -〔胡夕〕

JavaScript核心原理解析 -〔周爱民〕

数据分析思维课 -〔郭炜〕

Tony Bai · Go语言第一课 -〔Tony Bai〕

李智慧 · 高并发架构实战课 -〔李智慧〕

AI大模型企业应用实战 -〔蔡超〕

好记忆不如烂笔头。留下您的足迹吧 :)