数据集合
date
Mar 18, 2023
slug
js-set-init
status
Published
tags
Set
JavaScript数据结构与算法
JavaScript
summary
JavaScript set init
type
Post
构建数据集合
集合的概念
集合由一组无序且唯一(即不能重复)的项组成。可以把集合想象成一个既没有重复元素,也没有顺序概念的数组。
创建集合类
我们先使用ES2015创建原生Set类。JavaScript对象中不允许一个键指向两个不同的属性,也保证了集合里的元素都是唯一的。
class Set{
constructor(){
this.items = {};
}
}
has(element)
:如果元素在集合中,返回 true,否则返回 false
add(element)
:向集合添加一个新元素。
delete(element)
:从集合移除一个元素。
clear()
:移除集合中的所有元素。
size()
:返回集合所包含元素的数量。它与数组的 length 属性类似。
values()
:返回一个包含集合中所有值(元素)的数组。
判断元素是否在集合中
检验某个元素是否存在于集合中
使用 in 运算符来验证给定元素是否是 item 对象的属性。in 运算符返回表示对象在原型链上是否有特定属性的布尔值。
has(element){
return element in items;
}
Object 原型有 hasOwnProperty 方法。该方法返回一个表明对象是否具有特定属性的布尔值。
has(element){
return Object.prototype.hasOwnProperty.call(this.items,element);
}
添加元素
首先检查要添加的元素是否在集合中。如果不存在,就把 element 添加到集合中,返回 true,表示添加了该元素。如果集合中已经有了这个元素,就返回 false, 表示没有添加它。
add(element){
if(!this.has(element)){
this.items[element] = element;
return true;
}
return false;
}
添加一个 element 的时候,把它同时作为键和值保存,因为这样有利于查找该 元素。
删除集合中的元素
在 delete 方法中,我们会验证给定的 element 是否存在于集合中。如果存在,就从集合中移除 element,返回 true,表示元素被移除;否则返回 false。
delete(element){
if(this.has(element)){
delete this.items[element];
return true;
}
return false;
}
移除集合中的所有值即重置 items 对象
clear(){
this.items = {};
}
统计集合中的元素
- 使用一个 length 变量,每当使用 add 或 delete 方法时就控制它
- 使用 JavaScript 中 Object 类的内置方法
size(){
return Object.keys(this.items).length;
}
- 提取 items 对象的每一个属性,记录属性的个数并返回这个数
sizeLegacy(){
let count = 0;
for(let key in this.items){
if(this.items.hasOwnProperty(key)){
count ++;
}
return count;
}
}
获取集合中的所有值
迭代 items 对象的所有属性,添加到数组中并返回
valuesLegacy(){
let values = [];
for(let key in this.items){
if(this.items.hasOwnProperty(key)){
values.push(key);
}
}
return values;
}
另外,可以使用 Object 类内置的 values 方法。
values(){
return Object.values(this.items);
}
使用 Set 类
class Set{
constructor(){
this.items = {};
}
has(element){
return element in this.items;
}
add(element){
if(!this.has(element)){
this.items[element] = element;
return true;
}
return false;
}
delete(element){
if(this.has(element)){
delete this.items[element];
return true;
}
return false;
}
clear(){
this.items = {};
}
size(){
return Object.keys(this.items).length;
}
values(){
return Object.values(this.items);
}
}
const set = new Set();
set.add(1);
console.log(set.values()); // 输出[1]
console.log(set.has(1)); // 输出 true
console.log(set.size()); // 输出 1
set.add(2);
console.log(set.values()); // 输出[1, 2]
console.log(set.has(2)); // 输出 true
console.log(set.size()); // 输出 2
set.delete(1);
console.log(set.values()); // 输出[2]
set.delete(2);
console.log(set.values()); // 输出[]