Что такое JavaScript, эквивалентный С# HashSet?
У меня есть список из нескольких тысяч целых ключей. Единственное, что мне нужно сделать с этим списком, это сказать, указано ли данное значение в списке.
Для С# я бы использовал HashSet
для быстрого поиска. Что такое эквивалент JavaScript?
Минимальный уровень поддержки: IE 9+, jQuery (текущий)
Ответы
Ответ 1
Под капотом объект JavaScript реализуется с помощью хеш-таблицы.
Таким образом, ваша пара Key:Value
будет (your integer):true
Функция поиска по постоянному времени может быть реализована как:
var hash = {
1:true,
2:true,
7:true
//etc...
};
var checkValue = function(value){
return hash[value] === true;
};
checkValue(7); // => true
checkValue(3); // => false
Ответ 2
Используйте объект. Чтобы добавить ключ к набору, выполните следующие действия:
object[key] = true;
Чтобы проверить, находится ли ключ в наборе, выполните:
if (object.hasOwnProperty(key)) { ... }
Чтобы удалить ключ из набора, выполните:
delete object[key]
Ответ 3
На самом деле JavaScript предоставляет Установить объект, довольно простой в использовании:
var set = new Set();
set.add(1);
set.add(2);
set.has(1) // true
К сожалению, он несовместим с IE9.
Ответ 4
Вы можете использовать только обычный объект JavaScript и ключевое слово 'in', чтобы узнать, есть ли у этого объекта определенный ключ.
var myObj = {
name: true,
age: true
}
'name' in myObj //returns true;
'height' in myObj // returns false;
Или, если вы знаете, что у вас будут ключи в вашем объекте, которые могут быть созданы в свойствах объекта JavaScript, используйте...
var myObj = {
name: true,
age: true
}
myObj.hasOwnProperty('name') //returns true;
myObj.hasOwnProperty('height') // returns false;
Ответ 5
Я читал решения, и я пробовал. Попытавшись использовать метод object[key]
, я понял, что он не сработает. Я хотел, чтобы HashSet мог хранить элементы HTML. При добавлении этих объектов key
был переведен в строку, поэтому я придумал свой собственный набор, основанный на jQuery. Он поддерживает add
, remove
, contains
и clear
.
var HashSet = function () {
var set = [];
this.add = function (obj) {
if (!this.contains(obj)) {
set.push(obj);
}
};
this.remove = function (obj) {
set = jQuery.grep(set, function (value) {
return value !== obj;
});
};
this.clear = function () {
set = [];
};
this.contains = function (obj) {
return $.inArray(obj, set) > -1;
};
this.isEmpty = function () {
return set.length === 0;
};
};
Примечание
Добавляя в набор что-то вроде $('#myElement')
, нужно добавить настоящий HTML-элемент $('#myElement')[0]
. О... и если вы хотите сохранить список измененных элементов управления - используйте имя элемента (дал мне проблему с элементами управления :radio
).
Примечание2
Я думаю, что object[key]
может быть быстрее для ваших целых чисел.
Note3
Если вы собираетесь хранить только цифры или строку, этот набор будет быстрее:
var HashSet = function () {
var set = {};
this.add = function (key) {
set[key] = true;
};
this.remove = function (key) {
delete set[key];
};
this.clear = function () {
set = {};
};
this.contains = function (key) {
return set.hasOwnProperty(key);
};
this.isEmpty = function () {
return jQuery.isEmptyObject(set);
};
};