当前位置:首页 > JavaScript

js实现set

2026-04-06 05:00:35JavaScript

使用原生 JavaScript 实现 Set 功能

JavaScript 的 Set 是一种集合数据结构,用于存储唯一值。以下是一个简单的原生 JavaScript 实现:

class MySet {
  constructor() {
    this.items = {};
  }

  has(element) {
    return Object.prototype.hasOwnProperty.call(this.items, element);
  }

  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);
  }
}

使用对象存储集合元素

上述实现使用对象来存储集合元素,利用对象的键唯一性来保证集合元素的唯一性。has 方法检查元素是否存在,add 方法添加新元素,delete 方法移除元素。

js实现set

处理不同类型的值

JavaScript 的对象键会自动转换为字符串,这可能导致一些问题。例如,数字 1 和字符串 '1' 会被视为相同的键。为了解决这个问题,可以改进实现:

js实现set

class MySet {
  constructor() {
    this.items = [];
  }

  has(element) {
    return this.items.includes(element);
  }

  add(element) {
    if (!this.has(element)) {
      this.items.push(element);
      return true;
    }
    return false;
  }

  delete(element) {
    if (this.has(element)) {
      this.items.splice(this.items.indexOf(element), 1);
      return true;
    }
    return false;
  }

  clear() {
    this.items = [];
  }

  size() {
    return this.items.length;
  }

  values() {
    return [...this.items];
  }
}

实现集合运算

集合常见的运算包括并集、交集、差集和子集。以下是这些运算的实现:

union(otherSet) {
  const unionSet = new MySet();
  this.values().forEach(value => unionSet.add(value));
  otherSet.values().forEach(value => unionSet.add(value));
  return unionSet;
}

intersection(otherSet) {
  const intersectionSet = new MySet();
  this.values().forEach(value => {
    if (otherSet.has(value)) {
      intersectionSet.add(value);
    }
  });
  return intersectionSet;
}

difference(otherSet) {
  const differenceSet = new MySet();
  this.values().forEach(value => {
    if (!otherSet.has(value)) {
      differenceSet.add(value);
    }
  });
  return differenceSet;
}

isSubsetOf(otherSet) {
  return this.values().every(value => otherSet.has(value));
}

使用 ES6 的 Set

现代 JavaScript 已经内置了 Set 类,可以直接使用:

const set = new Set();
set.add(1);
set.add(2);
set.add(1); // 不会重复添加
console.log(set.size); // 2
console.log(set.has(1)); // true
set.delete(1);
console.log(set.has(1)); // false

性能考虑

原生实现的 Set 性能可能不如内置的 Set,特别是在处理大量数据时。内置 Set 经过优化,通常具有更好的性能。

标签: jsset
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…