Я отвечаю на свой вопрос, но я нашел альтернативное решение, которое показалось мне интересным, и подумал, что было бы полезно поделиться им.
Ответ Кволков дал мне идею. При условии, что метод toString()
объекта однозначно идентифицирует экземпляр, свойства объекта можно использовать для хранения набора объектов. По сути, для хранения объекта x
вы можете использовать items[x.toString()] = x;
. Обратите внимание, что значением является сам объект, поэтому набор объектов можно извлечь, просмотрев все свойства item
и выгрузив все значения в массив.
Вот класс, который я называю ObjectSet
, полностью. Это требует, чтобы объекты были однозначно идентифицированы их методом toString()
, который подходит для моих целей. add
, remove
и contains
должны работать быстрее, чем O (n) - независимо от эффективности доступа к свойствам javascript, которая, возможно, будет O (1) или O (n log n).
// Set of objects. Requires a .toString() overload to distinguish objects.
var ObjectSet = function ()
{
this.items = {};
this.item_count = 0;
};
ObjectSet.prototype.contains = function (x)
{
return this.items.hasOwnProperty(x.toString());
};
ObjectSet.prototype.add = function (x)
{
if (!this.contains(x))
{
this.items[x.toString()] = x;
this.item_count++;
}
return this;
};
ObjectSet.prototype.remove = function (x)
{
if (this.contains(x))
{
delete this.items[x.toString()];
this.item_count--;
}
return this;
};
ObjectSet.prototype.clear = function ()
{
this.items = {};
this.item_count = 0;
return this;
};
ObjectSet.prototype.isEmpty = function ()
{
return this.item_count === 0;
};
ObjectSet.prototype.count = function ()
{
return this.item_count;
};
ObjectSet.prototype.values = function ()
{
var i, ret = [];
for (i in this.items)
{
if (this.items.hasOwnProperty(i))
ret.push(this.items[i]);
}
return ret;
};