You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何使用Set存储tuple元组并实现自动去重

根因说明

JavaScript Set 采用 SameValueZero 规则判断元素是否相等,对于数组这类引用类型,对比的是内存引用地址而非内部存储的值。两个元素完全一致的独立数组会被判定为不同值,因此无法实现自动去重。

实现方案

方案1:序列化存储(最常用,实现成本最低)

将三元组序列化为唯一字符串存入Set,使用时再解析回数组即可。
代码示例:

const tupleSet = new Set();

// 新增元组
function addTuple([x, y, z]) {
  // 用JSON.stringify避免元素含逗号等特殊字符的冲突问题
  tupleSet.add(JSON.stringify([x, y, z]));
}

// 判断元组是否存在
function hasTuple([x, y, z]) {
  return tupleSet.has(JSON.stringify([x, y, z]));
}

// 获取所有元组(转回数组格式)
function getAllTuples() {
  return Array.from(tupleSet).map(item => JSON.parse(item));
}

// 测试
addTuple([1,2,0]);
addTuple([1,2,0]);
console.log(tupleSet.size); // 输出 1,符合去重预期

方案2:自定义元组类(适合需要保留对象操作的场景)

封装三元组类,自定义值对比逻辑,操作集合前先做校验。
代码示例:

class Tuple3 {
  constructor(x, y, z) {
    this.value = [x, y, z];
  }

  isEqual(otherTuple) {
    if (!(otherTuple instanceof Tuple3)) return false;
    return this.value.every((val, idx) => val === otherTuple.value[idx]);
  }
}

// 自定义带去重逻辑的集合类
class TupleSet {
  #set = [];

  add(tuple) {
    if (!this.#set.some(item => item.isEqual(tuple))) {
      this.#set.push(tuple);
    }
  }

  get size() {
    return this.#set.length;
  }

  // 可根据需要扩展has、delete等方法
}

// 测试
const set = new TupleSet();
set.add(new Tuple3(1,2,0));
set.add(new Tuple3(1,2,0));
console.log(set.size); // 输出 1

方案3:使用实验性原生特性(仅适合测试场景)

TC39 目前处于阶段3的Records & Tuples提案提供了原生值类型元组,支持直接存入Set自动去重,但该特性尚未正式纳入标准,生产环境不建议使用,可通过polyfill在测试环境体验。

内容的提问来源于stack exchange,提问作者daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:45:00