J'ai une liste de quelques milliers de clés entières. La seule chose que je dois faire avec cette liste est de dire si une valeur donnée est dans la liste.
Pour C #, j'utiliserais un HashSet
pour effectuer cette recherche rapidement. Quel est l'équivalent JavaScript?
Niveau de support minimal: IE 9+, jQuery (actuel)
Sous le capot, l'objet JavaScript est implémenté avec une table de hachage. Donc, votre Key:Value
_ paire serait (your integer):true
Une fonction de recherche à temps constant pourrait être implémentée comme suit:
var hash = {
1:true,
2:true,
7:true
//etc...
};
var checkValue = function(value){
return hash[value] === true;
};
checkValue(7); // => true
checkValue(3); // => false
En fait, JavaScript fournit un objet Set , assez simple à utiliser:
var set = new Set();
set.add(1);
set.add(2);
set.has(1) // true
Malheureusement, ce n'est pas compatible avec IE9.
Utilisez un objet. Pour ajouter une clé à l'ensemble, faites:
object[key] = true;
Pour tester si une clé est dans le jeu, faites:
if (object.hasOwnProperty(key)) { ... }
Pour supprimer une clé du jeu, procédez comme suit:
delete object[key]
Vous pouvez utiliser uniquement un objet JavaScript normal et le mot clé "in" pour voir si cet objet a une certaine clé.
var myObj = {
name: true,
age: true
}
'name' in myObj //returns true;
'height' in myObj // returns false;
Ou si vous savez que des objets dans votre objet seront éventuellement créés dans des propriétés JavaScript, utilisez les propriétés de l'objet JavaScript ...
var myObj = {
name: true,
age: true
}
myObj.hasOwnProperty('name') //returns true;
myObj.hasOwnProperty('height') // returns false;
Carte ou s'il n'est pas nécessaire d'itérer WeakMap
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}`);
});
J'ai lu les solutions et j'en ai essayé. Après avoir essayé d'utiliser la méthode object[key]
, J'ai compris que cela ne marcherait pas. Je voulais un HashSet pouvant stocker des éléments HTML. Lors de l'ajout de ces objets, le key
a été traduit en chaîne. C'est pourquoi j'ai créé mon propre jeu basé sur jQuery. Il supporte add
, remove
, contains
et 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;
};
};
Note
Lorsque vous ajoutez quelque chose comme $('#myElement')
à l'ensemble, vous devez ajouter le véritable élément HTML $('#myElement')[0]
. Oh ... et si vous voulez conserver une liste des commandes modifiées - utilisez le nom de l'élément (m'a donné un problème avec les commandes :radio
).
Note2
Je pense que le object[key]
Pourrait être plus rapide pour vos entiers.
Note
Si vous ne voulez stocker que des nombres ou des chaînes, cet ensemble sera plus rapide:
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);
};
};