如何在JavaScript中创建集合?
在雄辩的JavaScript第4章中,通过创建一个对象并将值存储为属性名称,将任意值(例如true)指定为属性值,创建了一组值。要检查该值是否已包含在集合中,请使用如何在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'; } 集合不允许重复条目,并且通常不保证
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”}代码>代码