javascript中的空集

javascript中的空集,javascript,set,logical-operators,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; } if ("users is empty" or user in users) allow_operation = true;

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

function createSetFromList(list) {
    var set = { };
    for (var i = 0; i < list.length; i++)
        set[list[i]] = true;
    return set;
}
if ("users is empty" or user in users) allow_operation = true;
我遇到的问题是,我想检查我的集合是否为空,如下所示:

function createSetFromList(list) {
    var set = { };
    for (var i = 0; i < list.length; i++)
        set[list[i]] = true;
    return set;
}
if ("users is empty" or user in users) allow_operation = true;
但我不知道如何检查集合是否为空。我试过:

if (users == { } || user in users) allow_operation = true;
但显然,逻辑表达式的第一部分永远都不是真的

我想这是因为当用户为空时,它仍然被初始化为一个对象,没有任何设置元素,并且一个对象永远不等于另一个对象

是否有任何解决方法来检查我的集合实现是否为空

编辑:我已经尝试了马尔沃里奥的建议,但有些奇怪的事情正在发生。我对其进行了一些修改,以了解发生了什么:

function showProperties(v) {
    for (x in v) {
        if (v.hasOwnProperty(x)) {
            $.log(x + " belongs");
        } else {
            $.log(x + " does not belong");
        }
    } 
}
运行此操作时:

showProperties(myset);
我总是只得到一行,不管我的集合是用哪个数据初始化的:

undefined belongs
我最好的礼物是

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

您可以使用数组执行任务

或者,如果需要对集合使用特殊类型的操作,可以将集合定义为:


注意,对象属性名称必须是字符串或数字,因此您必须重载toString以返回可能添加到集合中的任何对象的唯一字符串。数字实际上也是toString,即在阵列中使用时,您在编辑中询问的showProperties行为是另一个问题,因此应该提出一个不同的问题。这可能与我在第一篇评论中提到的问题有关,即泛型对象不适用于属性名称,因为名称必须是字符串!Object.keysmySet.length.@katspaugh Object.keys在IE8和中不受支持older@AndrewD.对于不太先进的环境,有太多的垫片,你真的不应该剥夺自己ES5的优点。@Malvolio:请原谅我的无知,但是你如何使用isEmptyObject函数?我是JS初学者,这个构造对我来说很奇怪。首先,使用for循环遍历属性,然后检查它们是否为对象属性。从定义上来说,这不是真的吗?第二,您将isEmptyObject定义为var。为什么不直接定义为function呢?@gonvaled您确实在遍历属性。如果没有属性,将永远无法到达循环体,并且函数向前移动以返回true为空。否则,函数返回false not empty。@gonvaled。是严格的相等比较运算符。阅读有关MDN中javascript运算符的更多信息:
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;