什么是相当于C#HashSet的JavaScript?

时间:2014-06-13 00:39:51

标签: javascript jquery hashset

我有几千个整数键的列表。我需要对此列表做的唯一事情是说明给定值是否在列表中。

对于C#,我会使用HashSet来快速查找。什么是JavaScript等价物?


最低支持级别:IE 9 +,jQuery(当前)

6 个答案:

答案 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的自己的集合。它支持addremovecontainsclear

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}`);
});