是否有像JavaScript中的Java Set这样的数据结构?

时间:2010-12-03 08:37:22

标签: java javascript dojo set

我想在JavaScript中使用可用于存储ID数量的数据结构。我应该能够检查该集合中是否存在密钥,例如Java Sets。

我希望得到如下相同的行为(此代码在Java中):

Set<String> st = new HashSet<String>();
//add elemets

if(st.contains("aks") ){
  //do something
}

我想要一个类似上面代码的JavaScript / dojo。

6 个答案:

答案 0 :(得分:20)

我编写了一个JavaScript HashSet实现,可以执行您想要的操作并允许任何对象成为该集合的成员:http://code.google.com/p/jshashtable

但是,如果您只需要存储字符串,则可以通过将set成员存储为普通Object的属性名称来更简单地执行某些操作。例如:

function StringSet() {
    var setObj = {}, val = {};

    this.add = function(str) {
        setObj[str] = val;
    };

    this.contains = function(str) {
        return setObj[str] === val;
    };

    this.remove = function(str) {
        delete setObj[str];
    };

    this.values = function() {
        var values = [];
        for (var i in setObj) {
            if (setObj[i] === val) {
                values.push(i);
            }
        }
        return values;
    };
}

关于实现的说明:valStringSet实现在内部使用的对象,对于每个集都是唯一的。将属性名称构成集合(setObj)的对象的属性值与val进行比较,无需进行hasOwnProperty()检查,并保证只有已添加到集合中的字符串才会显示在values

使用示例:

var set = new StringSet();
set.add("foo");
set.add("bar");

alert(set.contains("foo")); // true
alert(set.contains("baz")); // false

set.values(); // ["foo", "bar"], though not necessarily in that order
set.remove("foo");
set.values(); // ["bar"]

答案 1 :(得分:11)

为什么不使用普通对象并检查JavaScript的hasOwnProperty是否存在密钥?

var x = {};
x['key'] = 'val';
x.hasOwnProperty('key'); // true //
x.hasOwnProperty('key2'); // false //

这是一个更高级的用例:

var x = {};
var prefix = 'item_';
for(var i=0;i<10;i++){
   x[prefix+i] = 'value '+(i+1);
}
x.hasOwnProperty('item_6'); // true //
x.hasOwnProperty('other key'); // false //

删除项目可以这样做:

delete x['key'];

答案 2 :(得分:4)

不需要Dojo,这是Javascript原生的。使用对象。听起来你只需要键,而不是值。查找是不变的时间。

var st = {'aks':1, 'foo':1, 'bar':1};  // or could start with empty {}. 1 could be any value of any type, it's just short.

//add elements
st.baz = 1;

//or load up dynamically

myArrayOfStrings.forEach(function(key){
 st[key] = 1;
});


if("aks" in st){
  //do something
}

答案 3 :(得分:0)

可能使用关联数组/ Hashtable /字典(我不知道它是如何完全调用的),使用set元素作为键,使用“其他任何”作为值。

insert: mySet[key] = "Whatever";

delete: mySet[key] = null;

check: if (mySet[key] != null) { ... }

答案 4 :(得分:0)

Hash是实现Set的好选择。你可以使用类似的函数创建一个集合:

function set () {
    var result = {};
    for (var i = 0; i < arguments.length; i++) result[arguments[i]] = true;
    return result;
}

例如:

x = set([1,2,2,4])
x[1] #==> true
x[3] #==> false
x[5] = true; # add element to the set
x[5] = false; # remove element from the set

答案 5 :(得分:0)

设置没有键。它们只有一组值,但是映射具有一对键/值实体。

因此,您有2个选项。他们每个人都有其缺点和优点:

  1. 您可以使用上述JavaScript对象。实际上它是一个map / associative数组/哈希表。它的一个优点 - 你可以保证这种结构的钥匙 - 是独一无二的物品。它的缺点与问题有关 - 您必须保留一些您根本不需要的额外信息。地图的价值。真实或其他一些价值观。不要紧。你为什么需要它们?

  2. 要解决之前的缺点,您可以考虑使用JavaScript数组。但是,您必须编写一些包装器,以便数组的行为看起来像设置行为。此外,由uniqueId搜索的操作将比hashtables的相同操作慢,因为您必须遍历数组的所有项目。

  3. 所以,我认为你应该更喜欢哈希表到数组,你可以在其他帖子中找到这些例子。但是你应该考虑改变你的数据结构。如果可能的话,不要将uniqueId作为具有unselerss值的键。让您的唯一ID指向一些使用这些唯一ID的真实对象。

    PS:还有一件事。数组实际上也是对象。因此,它们也可以用作哈希表/地图。