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

aks*_*aks 15 javascript java dojo set

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

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

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

if(st.contains("aks") ){
  //do something
}
Run Code Online (Sandbox Code Playgroud)

我想要一个JavaScript/dojo等价的上述代码.

Tim*_*own 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;
    };
}
Run Code Online (Sandbox Code Playgroud)

关于实现的说明:val是实现内部使用的对象StringSet,每个集都是唯一的.比较其属性名称构成set(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"]
Run Code Online (Sandbox Code Playgroud)


Ali*_*aru 11

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

var x = {};
x['key'] = 'val';
x.hasOwnProperty('key'); // true //
x.hasOwnProperty('key2'); // false //
Run Code Online (Sandbox Code Playgroud)

这是一个更高级的用例:

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 //
Run Code Online (Sandbox Code Playgroud)

删除项目可以这样做:

delete x['key'];
Run Code Online (Sandbox Code Playgroud)


G B*_*G B 0

可能使用关联数组/哈希表/字典(我不知道它到底是如何调用的),使用集合元素作为键,使用“任何其他”作为值。

insert: mySet[key] = "Whatever";

delete: mySet[key] = null;

check: if (mySet[key] != null) { ... }
Run Code Online (Sandbox Code Playgroud)