代码之家  ›  专栏  ›  技术社区  ›  Tim Molendijk

javascript是否有一个集合数据结构的实现?

  •  32
  • Tim Molendijk  · 技术社区  · 15 年前

    我正在寻找用JavaScript实现一个合适的集合数据结构。它应该能够支持普通JavaScript对象的元素。

    到目前为止我只找到 Closure Library's structs.Set 但我不喜欢它修改我的数据。

    6 回复  |  直到 6 年前
        1
  •  10
  •   Tim Down    6 年前

    您可以围绕我提供的哈希表的键构建一个简单的包装器。 jshashtable . 我有一个要找的地方。

    更新

    我已经完成并测试了hashset的一个实现,并将其上载到GitHub上的JShashTable项目。你可以 download it view the source .

    var s = new HashSet();
    var o1 = {name: "One"}, o2 = {name: "Two"};
    s.add(o1);
    s.add(o2);
    s.values(); // Array containing o1 and o2
    
        2
  •  22
  •   Ciro Santilli OurBigBook.com    9 年前

    ECMAScript 6有

    Spec: http://www.ecma-international.org/ecma-262/6.0/#sec-set-constructor

    用法: https://github.com/lukehoban/es6features#map--set--weakmap--weakset

    例子:

    var s = new Set()
    s.add("hello").add("goodbye").add("hello")
    s.size === 2
    s.has("hello") === true
    

    在不支持浏览器的情况下实现它的模块: https://github.com/medikoo/es6-set

        3
  •  2
  •   user187291    15 年前

    我认为除了将对象存储在对象本身之外,没有其他方法可以处理对象的哈希代码。严格地说,使用简单的线性搜索,不需要散列就可以创建一个集合类,但这很难是有效的。

        4
  •  2
  •   CommonSenseCode    9 年前

    使用 the ECMAScript 2015 (ES6) standard Set Data structure 非常容易使用:

    var mySet = new Set();
    
    mySet.add(1);
    mySet.add(5);
    mySet.add("some text");
    var o = {a: 1, b: 2};
    mySet.add(o);
    
    mySet.has(1); // true
    mySet.has(3); // false, 3 has not been added to the set
    mySet.has(5);              // true
    mySet.has(Math.sqrt(25));  // true
    mySet.has("Some Text".toLowerCase()); // true
    mySet.has(o); // true
    
    mySet.size; // 4
    
    mySet.delete(5); // removes 5 from the set
    mySet.has(5);    // false, 5 has been removed
    
    mySet.size; // 3, we just removed one value
    

    使用AngularJS的更新

    注意集合不适用于 ng-repeat .所以最好使用一个数组并应用一个唯一的过滤器

        5
  •  1
  •   Lukas    11 年前

    我喜欢 Simple-JS-Set (可能是因为我写的)。它支持任何类型的javascript对象。它具有以下API:

    • Set(hashFunction) :(构造函数)用给定的 hashFunction (默认为 JSON.stringify )
    • add(item) :向集合中添加项
    • remove(item) :从集合中移除项
    • contains(item) :返回项是否包含在集合中
    • size() :返回集合中唯一项的数目
    • each(function(item), thisObj) :在上下文中对集合中的每个项执行函数 thisObj
        6
  •  1
  •   Salvador Dali    9 年前

    在ES6版本的javascript中,您内置了 set ( check compatibility with your browser )

    var numbers = new Set([1, 2, 4]); // Set {1, 2, 4}
    

    添加元素 到你简单使用的那套 .add() 运行在 O(1) 或者添加要设置的元素(如果它不存在),或者如果它已经存在,则不执行任何操作。可以在其中添加任何类型的元素(数组、字符串、数字)

    numbers.add(4); // Set {1, 2, 4}
    numbers.add(6); // Set {1, 2, 4, 6}
    

    检查元素数量 在集合中,您可以简单地使用 .size . 也运行在 O(1)

    numbers.size; // 4
    

    从集合中移除元素 使用 .delete() . 如果该值存在(并且已被删除),则返回true;如果该值不存在,则返回false。也运行在 O(1) .

    numbers.delete(2); // true
    numbers.delete(2); // false
    

    检查元素是否存在 成套使用 .has() ,如果元素在集合中,则返回true,否则返回false。也运行在 O(1) .

    numbers.has(3); // false
    numbers.has(1); // true
    

    除了您想要的方法之外,还有一些其他方法:

    • numbers.clear(); 只会从集合中移除所有元素
    • numbers.forEach(callback); 按插入顺序迭代集合的值
    • numbers.entries(); 创建所有值的迭代器
    • numbers.keys(); 返回集合的键,该键与 numbers.values()

    还有一个weakset,它只允许添加对象类型值。