在JavaScript中创建Set的方法?

hel*_*hod 76 javascript set

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

var set = {};

if (!'Tom' in set) { 
  set.Tom = true;
}
Run Code Online (Sandbox Code Playgroud)

这是惯用的JavaScript吗?不会使用阵列更好吗?

var set = [];

if (!'Tom' in set) { 
  set.push = 'Tom';
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ohn 90

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

ECMAScript 6具有适用于任意值的数据结构Set,快速并正确处理NaN.- Axel Rauschmayer,探索ES6

Axel Rauschmayer的书" 探索ES6"中的前两个例子:

管理单个元素:

> let set = new Set();
> set.add('red')

> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false
Run Code Online (Sandbox Code Playgroud)

确定Set的大小并清除它:

> let set = new Set();
> set.add('red')
> set.add('green')

> set.size
2
> set.clear();
> set.size
0
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关JavaScript中的集合的更多信息,请查看探索ES6.这本书可以免费在线阅读,但如果你想支持作者Axel Rauschmayer博士,你可以以30美元左右的价格购买这本书.

如果你现在想使用Sets和ES6,你可以使用Babel,ES6到ES5的转换器及其polyfill.

编辑:截至2017年6月6日,大多数主流浏览器在其最新版本(IE 11除外)中都有完整的Set支持.这意味着如果您不关心支持旧版浏览器,则可能不需要使用babel.如果您想查看包括当前浏览器在内的不同浏览器的兼容性,请查看Kangax的ES6兼容性表.


Chr*_*row 32

我使用dict对象作为集合.这适用于字符串和数字,但是如果你想使用自定义相等和比较运算符来创建一组对象,我想会产生问题:

创建一个集合:

var example_set = 
{
    'a':true,
    'b':true,
    'c':true
}
Run Code Online (Sandbox Code Playgroud)

测试是否包含在集合中

if( example_set['a'] ){
    alert('"a" is in set');
}
Run Code Online (Sandbox Code Playgroud)

将元素添加到集合中

example_set['d'] = true;
Run Code Online (Sandbox Code Playgroud)

从集合中删除元素

delete example_set['a'];


Jon*_*uis 16

集合不允许重复条目,通常不保证预定义的顺序.数组执行这两个操作,因此违反了集合的含义(除非您执行其他检查).

  • 数组不会过滤重复的条目...例如arr.push({id:1,name:“ Jake”})就像Objective-C中的NSSet :) (2认同)

Jus*_*ner 11

第一种方式是惯用的JavaScript.

只要您想存储键/值对,就必须使用JavaScript对象.至于数组,有几个问题:

  1. 索引是一个数值.

  2. 没有简单的方法来检查一个值是否在数组中没有循环.

  3. 集合不允许重复.数组呢.


ben*_*inz 8

如果要从数组创建集合,只需执行以下操作:

let arr = [1, 1, 2, 1, 3];
let mySet = new Set(arr); // Set { 1, 2, 3 }
Run Code Online (Sandbox Code Playgroud)

这是一个糖语法,我在Python编程时非常喜欢,很高兴ES6最终能够做同样的事情.

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

但是,欢迎来到2017年,现在您可以在所有主要的现代浏览器中使用正确的Set!


Wil*_*een 6

ES6/中设置ES2015

ES6/ ES2015现在已经内置了。集合是一种数据结构,它允许存储任何类型的唯一值,无论是原始值还是对象引用。可以使用ES6内置set构造函数以以下方式声明一个set :

const set = new Set([1, 2, 3, 4, 5]);
Run Code Online (Sandbox Code Playgroud)

使用Set构造函数创建集合时,我们新创建的set对象将从继承Set.prototype。这具有各种辅助方法和属性。这使您可以轻松地执行以下操作:

例:

const set = new Set([1, 2, 3, 4, 5]);
Run Code Online (Sandbox Code Playgroud)

浏览器兼容性:

除了缺少某些功能的IE之外,所有主流浏览器现在都完全支持集。有关确切的参考,请参阅mdn docs