Triés Application De La Feuille De
Ma Tâche
Dans mon code JavaScript, je suis souvent à l'aide d'objets à "la carte" des clés à des valeurs afin que je puisse ensuite accéder directement à travers une certaine valeur. Par exemple:
var helloMap = {};
helloMap.de = "Hallo";
helloMap["en"] = "Hello";
helloMap.es = "Hola";
Donc j'ai créer l'objet de plan étape par étape dans mon code source à l'aide de deux notations style d'objet et tableau de style.
Plus tard, je peux alors accéder aux valeurs, j'ai ajouté par helloMap["de"]
par exemple. Donc c'est bon si je n'ai pas de soins sur l'ordre dans lequel les attributs a été définie sur l'objet.
Si je veux parcourir les propriétés des objets maintenant, autant que je sache, il n'y a aucun moyen de s'assurer que je vais réitérer dans l'ordre où ils ont été ajoutés.
Remarque: je ne peux pas utiliser certains objet wrapper et il suffit de maintenir un tableau et puis il y utiliser ses méthodes pour ajouter les valeurs donc quelque chose comme ceci:
var HelloMap = function(){
this.myMap = [];
this.addProperty = function(key, value){
this.myMap.push({key: key, value: value});
}
}
ou quelque chose de similaire ne fonctionne pas pour moi. Donc, la solution doit être absolument transparent pour le programmeur à l'aide de l'objet.
Que dit l'objet que je serait un objet vide, qui maintient l'ordre des propriétés qui ont été ajoutées. Quelque chose comme ceci:
var helloMap = {};
helloMap = getOrderAwareObject(helloMap);
de sorte que chaque assignation de la forme helloMap.xy = "foo"
et helloMap["yz"] = "bar"
serait suivi dans l'objet "dans l'ordre",
Solutions Possibles
Depuis je n'ai pas trouvé de solution dans le trait de soulignement ou jQuery m'avoir donné un objet spécial, je suis tombé sur la possibilité de définir des accesseurs et mutateurs pour les propriétés à des objets JavaScript avec Object.defineProperty
depuis que je peux compter sur ECMAScript 5 standard je peux l'utiliser.
Le Problème avec ceci est que vous devez connaître toutes les propriétés qui peuvent être définies sur l'objet, avant qu'ils sont en réalité set. Car si vous définir il vous faut nom.
Ce que je cherche, c'est quelque chose comme un par Défaut de lecture et par Défaut Setter qui s'applique sur l'objet, si pas de getter et setter a été définie pour la propriété. De sorte que je ne puis cacher la triés carte derrière l'objet inteface.
- Il y a déjà une solution pour cela dans n'importe quel cadre vous savez?
- Est-il un mécanisme comme "par défaut getter/setter" ?
Oui.. bien.. merci. Mais le problème avec les tableaux associatifs est qu'ils ne peuvent pas être accessibles via l'opérateur point dont j'ai besoin. Et en passant... êtes-vous sûr qu'ils tiennent même theire commande?
Javascript n'est pas de faire des tableaux associatifs. Vous pouvez définir les propriétés de la Matrice, mais ils sont indépendants de Tableau indexé éléments, et sont sans ordre de la même manière que les propriétés d'une plaine js objet.
Ok merci des Tableaux aura pas de solution ici. Au moins dans le "front" de la mise en œuvre. L'objet peuvent vif un tableau dans le dos, mais qui doit être transparent sur le côté d'objet.
Si l'ordre est important, la Matrice est la seule solution. Oui, vous pouvez le cacher à l'intérieur d'un objet construit.
OriginalL'auteur Chris | 2013-02-01
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin d'un wrapper de quelque sorte l'aide d'un tableau à l'interne, je le crains. ECMAScript 5 (qui est la norme actuelle du navigateur JavaScript implémentations sont fondées), il suffit de ne pas permettre à l'ordre des propriétés de l'objet.
Cependant, ECMAScript 6 auront un
Map
de la mise en œuvre qui a commandé propriétés. Voir aussi http://www.nczonline.net/blog/2012/10/09/ecmascript-6-collections-part-2-maps/.Il peut aussi y avoir d'autres options dans ECMAScript 6. Voir la question suivante:
Comment puis-je définir une valeur par défaut de lecture et de définition à l'aide de ECMAScript 5?
OriginalL'auteur Tim Down
D'ajouter un lien à une coutume de la bibliothèque javascript qui fournit Triés cartes et d'autres de la mise en œuvre, pour la future référence dans ce fil . Découvrez https://github.com/monmohan/dsjslib
-msingh
OriginalL'auteur factotum
Je ne sais pas de solution générale, mais les non-solutions générales sont très simple à construire.
Généralement, vous maintenez un Tableau d'objets, avec plusieurs méthodes définies comme des propriétés de la Matrice. Au moins, c'est mon approche.
Voici un exemple, pris (dans une forme modifiée) à partir d'une application plus large :
Malheureusement, vous perdez la simplicité d'une plaine js objet de recherche, mais c'est le prix à payer pour avoir un ordre de l'entité.
Si vous devez absolument avoir de l'ordre et de la dot.la notation, de la maintenir à un simple Objet js pour la recherche de et un Tableau de l'ordre. Avec soin, les deux peut être maintenu avec une intégrité totale.
OriginalL'auteur Beetroot-Beetroot
Voir ma réponse à cette question. J'ai mis en place une base ordonnée de table de hachage (ES 5+, n'a pas pris la peine de polyfill)
OriginalL'auteur Jared Smith
Mettre la méthode en aura toujours une paire clé-valeur, crée en interne sur une autre carte avec triés clés de la carte, mise à jour de la valeur et le retour de la mise à jour de la carte avec triés clés.Aucune bibliothèque externe doivent inclue dans le prix.
OriginalL'auteur Amit Sharma