Ich habe eine Liste mit einigen tausend Ganzzahlschlüsseln. Das einzige, was ich mit dieser Liste tun muss, ist zu sagen, ob ein bestimmter Wert in der Liste enthalten ist oder nicht.
Für C # würde ich a verwenden HashSet
, um diese Suche schnell zu machen. Was ist das JavaScript-Äquivalent?
Minimale Unterstützungsstufe: IE 9+, jQuery (aktuell)
javascript
jquery
hashset
Jonathan Allen
quelle
quelle
Antworten:
Unter der Haube wird das JavaScript-Objekt mit einer Hash-Tabelle implementiert. Also
Key:Value
wäre dein Paar(your integer):true
Eine zeitlich konstante Suchfunktion könnte implementiert werden als:
var hash = { 1:true, 2:true, 7:true //etc... }; var checkValue = function(value){ return hash[value] === true; }; checkValue(7); // => true checkValue(3); // => false
quelle
Set
undMap
sind die besten Dinge zu verwenden, wenn Sie ein Set oder eine Karte benötigen.Tatsächlich bietet JavaScript ein Set-Objekt , das recht einfach zu verwenden ist:
var set = new Set(); set.add(1); set.add(2); set.has(1) // true
Leider ist es nicht mit IE9 kompatibel.
quelle
Verwenden Sie ein Objekt. Gehen Sie folgendermaßen vor, um dem Set einen Schlüssel hinzuzufügen:
object[key] = true;
Um zu testen, ob sich ein Schlüssel im Set befindet, gehen Sie wie folgt vor:
if (object.hasOwnProperty(key)) { ... }
Gehen Sie wie folgt vor, um einen Schlüssel aus dem Set zu entfernen:
delete object[key]
quelle
unset
? Der Operator istdelete
in JS!object.hasOwnProperty(key)
. Ansonsten ,"toString" in object == true
.Sie können nur ein reguläres JavaScript-Objekt und das Schlüsselwort 'in' verwenden, um festzustellen, ob dieses Objekt einen bestimmten Schlüssel hat.
var myObj = { name: true, age: true } 'name' in myObj //returns true; 'height' in myObj // returns false;
Oder wenn Sie wissen, dass Ihr Objekt Schlüssel enthält, die möglicherweise in JavaScript-Objekteigenschaften erstellt wurden, verwenden Sie ...
var myObj = { name: true, age: true } myObj.hasOwnProperty('name') //returns true; myObj.hasOwnProperty('height') // returns false;
quelle
Ich habe die Lösungen gelesen und einige ausprobiert. Nachdem
object[key]
ich versucht hatte, die Methode anzuwenden , stellte ich fest, dass sie nicht funktionieren würde. Ich wollte ein HashSet, das HTML-Elemente speichern kann. Beim Hinzufügen dieser Objektekey
wurde das in eine Zeichenfolge übersetzt, sodass ich ein eigenes Set basierend auf jQuery entwickelte. Es unterstütztadd
,remove
,contains
undclear
.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; }; };
Hinweis
Wenn Sie
$('#myElement')
dem Set etwas Ähnliches hinzufügen, sollten Sie das echte HTML-Element hinzufügen$('#myElement')[0]
. Oh ... und wenn Sie eine Liste der geänderten Steuerelemente behalten möchten, verwenden Sie den Namen des Elements (gab mir ein Problem mit den:radio
Steuerelementen).Hinweis 2
Ich denke, das
object[key]
könnte für Ihre ganzen Zahlen schneller sein.Hinweis 3
Wenn Sie nur Zahlen oder Zeichenfolgen speichern möchten , ist dieser Satz schneller:
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); }; };
quelle
Map oder wenn keine Notwendigkeit besteht, WeakMap zu iterieren
let m1=new Map(); m1.set('isClosed',false); m1.set('isInitialized',false); m1.set('isClosed',true); m1.forEach(function(v,k) { console.log(`${k}=${v}`); });
quelle