数据集合

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 = {};
}

统计集合中的元素

  1. 使用一个 length 变量,每当使用 add 或 delete 方法时就控制它
  1. 使用 JavaScript 中 Object 类的内置方法
    1. size(){
          return Object.keys(this.items).length;
      }
  1. 提取 items 对象的每一个属性,记录属性的个数并返回这个数
    1. 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()); // 输出[]

© shallrise 2024