我在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
答案 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;