在javascript中设置空

时间:2011-11-01 08:09:36

标签: javascript set logical-operators

我在javascript中实现了一个基于通用对象类型的set数据类型,如下所示:

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

现在我可以轻松检查给定值是否属于集合:

var users = createSetFromList(my_users);
if (user in users) allow_operation = true;

我遇到的问题是我想检查我的设置是否为空,如下所示:

if ("users is empty" or user in users) allow_operation = true;

但我不知道如何检查该组是否为空。我尝试过:

if (users == { } || user in users) allow_operation = true;

但显然逻辑表达式的第一部分永远不会成真。

我想这与以下事实有关:当用户为空时,它仍然被初始化为一个对象,没有任何设置元素,并且一个对象永远不会等同于另一个对象?

是否有任何解决方法可以检查我的设置实现是否空虚?

编辑:我已经尝试过Malvolio的建议,并且发生了一些奇怪的事情。我已经修改了一下,看看发生了什么:

function showProperties(v) {
    for (x in v) {
        if (v.hasOwnProperty(x)) {
            $.log(x + " belongs");
        } else {
            $.log(x + " does not belong");
        }
    } 
}

运行时:

showProperties(myset);

我总是只得到一行,无论我的集合初始化了哪些数据:

undefined belongs

2 个答案:

答案 0 :(得分:2)

我最好的是

var isEmptyObject = function(v) { 
   for (x in v) {
     if (v.hasOwnProperty(x)) {
          return false;
     }
   } 
   return true;
};

答案 1 :(得分:1)

您可以使用Array来完成任务。

或者如果您需要在 set 上使用特殊类型的操作,您可以将 set 定义为:

function SetOfValues(list) {
    if(!(this instanceof SetOfValues))
       return arguments.length===1?new SetOfValues(list):new SetOfValues;
    if(arguments.length===1)for(var i=0;i<list.length;i++)this[list[i]]=true;
}
SetOfValues.prototype.in=function(item) {
  return this.hasOwnProperty(item);
}
SetOfValues.prototype.empty=function() {
  for(var p in this)if(this.hasOwnProperty(p))return false;
  return true;
}

然后创建并使用 set

var users = new SetOfValues(my_users);
// or with help of SetOfValues definition simply:
// var users = SetOfValues(my_users);
if(users.in(user)) allow_operation = true;
if(users.empty()||users.in(user)) allow_operation = true;