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
相关产品推荐
相关产品推荐

