Пустой набор в JavaScript - PullRequest
       28

Пустой набор в JavaScript

0 голосов
/ 01 ноября 2011

Я реализовал тип данных набора в javascript, основанный на универсальном типе объекта, например:

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;

Но, очевидно, первая часть логического выражения никогда не верна.

Я полагаю, это связано с тем фактом, что когда пользователи пустые, они все еще инициализируются как объект, без каких-либо элементов набора, и объект никогда не равен другому объекту?

Есть ли обходной путь для проверки пустоты для моей реализации набора?

РЕДАКТИРОВАТЬ: Я опробовал предложение Мальволио, и происходит нечто странное. Я немного изменил его, чтобы увидеть, что происходит:

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 ]

2 голосов
/ 01 ноября 2011

Лучшее, что у меня есть

var isEmptyObject = function(v) { 
   for (x in v) {
     if (v.hasOwnProperty(x)) {
          return false;
     }
   } 
   return true;
};
1 голос
/ 01 ноября 2011

Вы можете использовать массив для своей задачи.

Или, если вам нужно использовать особый вид операций для 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;
}

, а затем создать и использовать установить как:

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;
...