我有几千个整数键的列表。我需要对此列表做的唯一事情是说明给定值是否在列表中。
对于C#,我会使用HashSet
来快速查找。什么是JavaScript等价物?
最低支持级别:IE 9 +,jQuery(当前)
答案 0 :(得分:60)
在引擎盖下,JavaScript对象使用哈希表实现。
因此,您的Key:Value
对将是(your integer):true
恒定时间查找功能可以实现为:
var hash = {
1:true,
2:true,
7:true
//etc...
};
var checkValue = function(value){
return hash[value] === true;
};
checkValue(7); // => true
checkValue(3); // => false
答案 1 :(得分:39)
实际上,JavaScript提供了Set object,使用相当简单:
var set = new Set();
set.add(1);
set.add(2);
set.has(1) // true
不幸的是,它与IE9不兼容。
答案 2 :(得分:30)
使用对象。要为集合添加密钥,请执行以下操作:
object[key] = true;
要测试密钥是否在集合中,请执行以下操作:
if (object.hasOwnProperty(key)) { ... }
要从集合中删除密钥,请执行以下操作:
delete object[key]
答案 3 :(得分:7)
您只能使用常规JavaScript对象和' in'用于查看该对象是否具有某个键的关键字。
var myObj = {
name: true,
age: true
}
'name' in myObj //returns true;
'height' in myObj // returns false;
或者,如果您知道您将在对象中拥有可能构建在JavaScript对象属性中的键,请使用...
var myObj = {
name: true,
age: true
}
myObj.hasOwnProperty('name') //returns true;
myObj.hasOwnProperty('height') // returns false;
答案 4 :(得分:2)
我已经阅读了解决方案,我尝试了一些。尝试使用object[key]
方法后,我意识到它无法正常工作。我想要一个可以存储HTML元素的HashSet。添加这些对象时,key
被转换为字符串,因此我想出了基于jQuery的自己的集合。它支持add
,remove
,contains
和clear
。
var HashSet = function () {
var set = [];
this.add = function (obj) {
if (!this.contains(obj)) {
set.push(obj);
}
};
this.remove = function (obj) {
set = jQuery.grep(set, function (value) {
return value !== obj;
});
};
this.clear = function () {
set = [];
};
this.contains = function (obj) {
return $.inArray(obj, set) > -1;
};
this.isEmpty = function () {
return set.length === 0;
};
};
注意强>
在向集合中添加$('#myElement')
之类的内容时,应添加真实的HTML元素$('#myElement')[0]
。哦......如果你想保留一个已更改的控件列表 - 使用元素的名称(给我一个:radio
控件的问题)。
<强>注2 强>
我认为整数object[key]
可能会更快。
<强>注3 强>
如果你只想存储数字或字符串,这个集合会更快:
var HashSet = function () {
var set = {};
this.add = function (key) {
set[key] = true;
};
this.remove = function (key) {
delete set[key];
};
this.clear = function () {
set = {};
};
this.contains = function (key) {
return set.hasOwnProperty(key);
};
this.isEmpty = function () {
return jQuery.isEmptyObject(set);
};
};
答案 5 :(得分:1)
地图,或者如果不需要迭代WeakMap
let m1=new Map();
m1.set('isClosed',false);
m1.set('isInitialized',false);
m1.set('isClosed',true);
m1.forEach(function(v,k)
{
console.log(`${k}=${v}`);
});