Obtenir la prochaine paire clé-valeur dans un objet
Donné une clé, je veux trouver la propriété suivante dans un objet. Je ne peux pas compter sur les touches pour être commandé ou séquentielle (ils sont uuid). Veuillez voir ci-dessous pour un exemple trivial de ce que je veux:
var db = {
a: 1,
b: 2,
c: 3
}
var next = function(db, key) {
//???
}
next(db, 'a'); //I want 2
next(db, 'b'); //I want 3
Je veux aussi un prev() de la fonction, mais je suis sûr que ce sera la même solution.
Cela semble un problème trivial, mais je ne peux pas pour la vie de me comprendre comment le faire.
Heureux pour la solution à utiliser underscore.js ou être écrit en coffeescript 🙂
- "Donc, compte tenu de "la clé", je veux regarder pour la première instance d'un objet." - Qu'entendez-vous la "première instance"? Vous ne pouvez pas avoir plus d'une propriété du même nom, donc il ne peut pas être une deuxième instance. "Je veux retourner la valeur de la propriété SUIVANTE." - Vous ne pouvez pas compter sur les propriétés de l'objet en cours dans un ordre particulier (même si certains - la plupart des? les navigateurs ont tendance à renvoyer les propriétés dans l'ordre de leur création). Si vous en avez besoin pour être commandé, vous devez utiliser un tableau.
- c'est un bon point sur le navigateur de la propriété de la commande merci. Je pense que j'ai peut-être simplement besoin de tirer de cette info dans un tableau ordonné alors traverser QUE les.
- je pense que ce n'est pas une bonne question. parce que l'ordre de la
db
objet key n'est pas cohérente. la racine de ce problème est la structure de données -db
. sidb
ne peut pas être changé, il n'y a pas de réponse. - Même s'il est âgé d'un an, je suis en désaccord avec vous @island205. Cette question a été quelque chose que j'allais poser, même si j'ai eu un pressentiment qu'il ne pouvait pas être accompli. L'on a accepté la réponse m'a aussi donné un travail, même s'il complique le processus un peu, c'est une solution efficace.
Vous devez vous connecter pour publier un commentaire.
La bonne réponse est: vous ne pouvez pas le faire, comme les objets sont non ordonnée que par ECMAScript du spec.
Je recommande que vous utilisez une structure ordonnée, comme un tableau, pour le but du problème:
Puis le
next
fonction peut être quelque chose comme:En cas
key
n'existe pas surdb
ou c'était le dernier,next
retourneundefined
. si vous n'êtes jamais allez demander pour le suivant du dernier élément, vous pouvez simplifier cette fonction en supprimant le ternaire&&
opérateur et le retourdb[i + 1].value
directement.Vous pouvez également utiliser une partie de Underscore.js les méthodes de l'utilitaire pour faire
next
de plus simple:(dans ce cas
next
pourrait revenirfalse
parfois... mais c'est encore un falsy valeur :))Maintenant, d'un point de vue plus pragmatique réponse pourrait être que, comme la plupart des navigateurs de respecter l'ordre dans lequel un objet est initialisé lors de l'itération cela, il vous suffit de le parcourir avec un
for in
boucle comme les autres réponses suggèrent. Je vous recommande d'utiliserde l'Objet.les touches
pour simplifier le travail de parcourir le tableau:ts /es6 version. J'ai simplement obtenir les clés de la storeObject, regardez pour le prochain Indice.
Une solution immédiate à ce problème serait de stocker des données dans un tableau et d'utiliser l'objet de simplement stocker les index dans le tableau au cours de laquelle un objet existe.
L'idée de base est d'utiliser une structure ordonnée, dans ce cas, le tableau, pour contenir les données de manière séquentielle. Dans ce cas, suivant et précédent sont à la fois la constante de temps, ajouter est amorti de la constante de temps, et de supprimer est O(N).
De la commande de touches n'est pas garanti par la norme ECMA, donc
for/in
n'a pas besoin d'être dans l'ordre les touches ont été ajoutées (même si dans la pratique, qui tend à être la mise en commun). Dans cette solution, j'utilise un tableau explicitement garder une trace de l'insert de commande.Edit: j'ai oublié la suppression d'une question tout à l'heure avec le collage. L'indice qui allait devenir incorrect pour toutes les valeurs après la épissé valeur pour les supprimer. Le correctif n'a pas d'impact sur le temps d'exécution de la complexité de l'opération. Une version plus rapide avec moins d'supprime pourrait laisser la matrice de devenir rare et au lieu de l'épissage, il suffit de définir l'index pour null gratuit toute référence qui y sont stockées. Cela permettrait de réduire l'opération de suppression à O(1).
À l'aide de undercore.js, vous pouvez prendre les clés d'un objet et d'en faire le tour. Mais je ne suis pas sûr si les paires clé-valeur sont classés en aucune façon pour commencer:
jsFiddle: http://jsfiddle.net/QWhN2/
indexOf
est O(N), et.keys
crée une copie de chaque touche, chaque appel (O(N) dans l'exécution et l'espace mémoire)