在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
集合不允许重复条目,通常不保证预定义的顺序.数组执行这两个操作,因此违反了集合的含义(除非您执行其他检查).
Jus*_*ner 11
第一种方式是惯用的JavaScript.
只要您想存储键/值对,就必须使用JavaScript对象.至于数组,有几个问题:
索引是一个数值.
没有简单的方法来检查一个值是否在数组中没有循环.
集合不允许重复.数组呢.
如果要从数组创建集合,只需执行以下操作:
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!
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。
| 归档时间: |
|
| 查看次数: |
82908 次 |
| 最近记录: |