2011-11-01 3 views
-1

я реализовал множество типов данных в JavaScript, основанный в родовом типе объекта, например:Пустой набор в 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; 

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

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

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

EDIT: Я опробовал предложение Мальволио, и что-то странное происходит. Я изменил его немного, чтобы увидеть, что происходит:

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

возможно дублировать [Как проверить пустой объект Javascript из JSON?] (http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object-from-json) –

+0

Примечание. что имена объектов объекта должны быть строками или цифрами, поэтому вы должны перегружать 'toString', чтобы возвращать уникальную строку для любого объекта, который может быть добавлен в набор. – outis

+0

Номера на самом деле тоже toString'd, т. Е. При использовании в массивах – meandmycode

ответ

2

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

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

В одной строке: '! Object.keys (mySet) .length'. – katspaugh

+0

@katspaugh Object.keys не поддерживается в IE8 и старше –

+0

@ Андрю Д., есть так много прокладок для менее сложных сред, которые вы действительно не должны лишать себя доброты ES5. – katspaugh

1

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

Или, если вам нужно использовать специальный вид операций на наборе можно определить установить как:

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; 
+0

Извините, что такое '==='? – dangonfast

+0

@ gonvaled. Является оператором сравнения _strict equal_. Подробнее о операторах javascript в MDN: https://developer.mozilla.org/en/JavaScript/Reference/Operators –

Смежные вопросы