如何在JavaScript中创建集合?

如何在JavaScript中创建集合?,javascript,set,Javascript,Set,在雄辩的JavaScript第4章中,通过创建一个对象并将值存储为属性名称,将任意值(例如true)指定为属性值,创建了一组值。要检查该值是否已包含在集合中,请使用in运算符: var set = {}; if (!'Tom' in set) { set.Tom = true; } 这是惯用JavaScript吗?使用数组不是更好吗 var set = []; if (!'Tom' in set) { set.push = 'Tom'; } 集合不允许重复条目,并且通常不保证

在雄辩的JavaScript第4章中,通过创建一个对象并将值存储为属性名称,将任意值(例如true)指定为属性值,创建了一组值。要检查该值是否已包含在集合中,请使用
in
运算符:

var set = {};

if (!'Tom' in set) { 
  set.Tom = true;
}
这是惯用JavaScript吗?使用数组不是更好吗

var set = [];

if (!'Tom' in set) { 
  set.push = 'Tom';
}

集合不允许重复条目,并且通常不保证预定义的顺序。数组同时执行这两种操作,因此违反了集合的含义(除非进行额外检查)。

第一种方法是惯用JavaScript

每当您想要存储键/值对时,都必须使用JavaScript对象。至于阵列,有几个问题:

  • 索引是一个数值

  • 要检查值是否在数组中而不进行循环,这不是一种简单的方法

  • 集合不允许重复。数组可以


  • 使用裸javascript对象来模拟集合有两个问题:首先,一个对象可以有一个继承的属性,这将导致“in”操作符;其次,您只能以这种方式存储标量值,因此不可能创建一组对象。因此,集合的实际实现应该提供方法
    add
    contains
    ,而不是在和属性赋值中使用普通的

    您可以尝试,它是一个javascript数据结构库,拥有操作集合所需的一切。

    我使用dict对象作为集合。这适用于字符串和数字,但如果您希望使用自定义相等和比较运算符创建一组对象,我认为这会导致问题:

    创建集合:

    var example_set = 
    {
        'a':true,
        'b':true,
        'c':true
    }
    
    测试是否包含在集合中

    if( example_set['a'] ){
        alert('"a" is in set');
    }
    
    example_set['d'] = true;
    
    向集合中添加元素

    if( example_set['a'] ){
        alert('"a" is in set');
    }
    
    example_set['d'] = true;
    
    从集合中删除元素

    if( example_set['a'] ){
        alert('"a" is in set');
    }
    
    example_set['d'] = true;
    
    删除示例集['a']

    现在可以在ES2015中使用(也称为ES6,即ECMAScript 6)。自2015年6月以来,ES6一直是JavaScript的当前标准

    ECMAScript 6的数据结构集适用于任意 值,速度快且处理正确。-

    书中的前两个例子:

    管理单一要素:

    确定集合的大小并清除它:

    如果您想了解有关JavaScript中集合的更多信息,我将进行检查。这本书是免费在线阅读的,但是如果你想支持作者,你可以花30美元左右购买这本书

    如果您现在想使用Sets和ES6,您可以使用ES6到ES5 transpiler及其polyfills

    编辑:截至2017年6月6日,大多数主要浏览器的最新版本都提供了全套支持(IE 11除外)。这意味着,如果您不想支持较旧的浏览器,您可能不需要babel。如果要查看不同浏览器(包括当前浏览器)中的兼容性,请检查

    编辑:

    var example_set = 
    {
        'a':true,
        'b':true,
        'c':true
    }
    
    只是关于初始化的澄清。集合可以在其构造函数中采用任何同步iterable。这意味着它们不仅可以接受数组,还可以接受字符串和迭代器。以以下集合的数组和字符串初始化为例:

    const set1=新集合(['a','a','b','b','c','c']);
    console.log(…set1);
    console.log(set1.size);
    const set2=新集合(“aabbcc”);
    console.log(…set2);
    
    console.log(set2.size)如果要从数组创建集合,只需执行以下操作:

    let arr = [1, 1, 2, 1, 3];
    let mySet = new Set(arr); // Set { 1, 2, 3 }
    
    这是我在用Python编程时非常喜欢的一种糖类语法,很高兴ES6最终能够实现同样的功能

    注意:然后我意识到我所说的并没有直接回答你的问题。在ES5中出现这种“hack”的原因是,按键在对象中的查找时间(O(1))明显快于在数组中的查找时间(O(n))。在性能关键型应用程序中,您可以牺牲这一点可读性或直觉来获得更好的性能

    但是,欢迎来到2017年,在这里,您现在可以在所有主要的现代浏览器中使用适当的Set

    ES6
    /
    ES2015
    中设置:
    ES6
    /
    ES2015
    现在已内置套件。集合是一种数据结构,允许存储任何类型的唯一值,无论是基元值还是对象引用。可以使用
    ES6
    内置集合构造函数以以下方式声明集合:

    const set = new Set([1, 2, 3, 4, 5]);
    
    使用集合构造函数创建集合时,新创建的集合对象继承自
    set.prototype
    。它有各种辅助方法和属性。这使您可以轻松地执行以下操作:

    例子:
    const set=新集合([1,2,3,4,5]);
    //检查集合的大小
    console.log('大小为:'+set.size);
    //has方法返回布尔值,如果项在集合中,则返回true
    console.log(set.has(1));
    //加号
    增加(6);
    //删除一个数字
    设置。删除(1);
    //使用回调函数迭代每个元素
    set.forEach((el)=>{
    控制台日志(el);
    });
    //从集合中删除所有条目
    
    set.clear()
    Set对象的基本创建和使用对于Set
    中的
    'Tom'为真的数组,您希望它是什么样子?看起来你对某件事的假设是错误的,我想知道是什么。仅供参考,你需要参数:
    如果(!('Tom'in set))
    。目前它在集合中的意思是
    ,因为
    !'Tom'==false
    。ES6有集合,请参见下面John的答案,最好为属性值指定什么?可以从JavaScript数组中删除重复元素@kojiro:对象用作键时会转换为字符串:
    set={};集合[{x:1}]=123;警报(set[{z:99}])
    它是否提供了addAll(数组)方法?数组不会过滤重复的条目。。。例如,arr.push({id:1,name:“Jake”})类似于Objective-C:)中的NSSet,如果您使用它mot-a-mot,则不会。但是您可以将该id用作数组(map)键<代码>arr[id]={“name”:“Jake”}代码