Comment trier une collection d'objets en JavaScript sans convertir un tableau
Je suis en train d'essayer d'éviter l'écriture de mon propre algorithme de tri pour la suite de cas d'utilisation:
avatars = {};
avatars[102] = {userInfo: {buddy_name: 'Avatar102', is_online: 1}};
avatars[100] = {userInfo: {buddy_name: 'Avatar100', is_online: 1}};
avatars[101] = {userInfo: {buddy_name: 'Avatar101', is_online: 1}};
console.log(_.keys(avatars));
avatars = _.sortBy(avatars, function(avatar) {return avatar.userInfo.buddy_name.toLowerCase();});
console.log(_.keys(avatars));
Voici la sortie de la console:
- ["102", "100", "101"]
- ["0", "1", "2"]
Comme vous pouvez le voir, avec undescore de sortBy je suis perdre la clé de données. Cette structure peut être très grande, donc j'essaie d'éviter des choses comme la conversion d'un tableau et puis retourner à la collection. Est-il possible de le faire sans rouler ma propre fonction de tri?
Des Avatars est un Dictionnaire et non triés, de par leur nature. Alors, qu'est-ce exactement avez-vous besoin? La capacité à effectuer une itération sur les avatars dans l'ordre?
jsfiddle.net/zL9GD/2
jsfiddle.net/zL9GD/2
OriginalL'auteur Rosco | 2012-05-16
Vous devez vous connecter pour publier un commentaire.
Votre
avatars
n'est pas un Tableau, c'est juste un objet:il est donc pas d'ordre défini pour l'un de ses éléments:
et 15.2.3.7 (et 15.2.3.14):
Vous pouvez également vérifier la section 8.6 pour voir si il n'y a aucune mention au sujet de l'ordre des propriétés d'un objet. La seule exigence pour la commande de propriétés de l'objet, c'est que si la mise en œuvre définit une commande n'importe où alors, il doit utiliser la même commande de partout, mais c'est un gros si. La plupart des implémentations probablement utiliser la commande d'insertion d'un objet avec les touches, mais je ne peux pas trouver quelque chose qui exige d'eux (je vous en serais reconnaissant un commentaire si quelqu'un peut le remarquer quoi que ce soit dans les spécifications qui définissent un ordre particulier d'un objet avec les touches).
Cela dit, le trait de Soulignement est
sortBy
est fondamentalement un Schwartzian Transformer combiné avec un JavaScript standardsort
et le trait de Soulignement estplumer
déballer le Schwartzian Transformer mémo wrappers;pluck
retourne un tableau de façonsortBy
également retourne un tableau. Par conséquent, votre final_.keys(avatars)
appel est fait appel_.les touches
sur un tableau; les clés d'un tableau (AKA énumérable propriétés) sont la matrice des indices et ceux qui sont des nombres entiers consécutifs commençant à zéro.Vous utilisez la mauvaise structure de données. Si vous avez besoin d'un tableau fragmenté, mais aussi besoin de la manipuler comme un tableau (c'est à dire de tri de cela), alors vous devriez mettre l'index à l'intérieur les objets et les utiliser un tableau normal et
pluck
au lieu dekeys
:Démo: http://jsfiddle.net/ambiguous/UCWL2/
Si vous avez également besoin d'un accès rapide par
idx
alors vous pourriez mettre en place un système parallèle d'objet directidx
accès:Puis
avatars_by_idx
fournit l'accès direct vous êtes à la recherche pour. Bien sûr, vous auriez à garderavatars
etavatars_by_idx
synchronisé, mais ce n'est pas très difficile si vous les cacher à la fois derrière un objet.Si vous êtes juste à travailler avec les premières
avatars
données, puis utiliser leavatars
tableau ci-dessus que le magasin principal et garder un objet qui mappe laidx
à des objets de laavatars
tableau. Extra ceavatars_by_idx
objet permettrait d'atteindre le même but comme un index dans une base de données.hmm - je pensais le contraire - la banque de données serait la collection d'objets posés sur idx, et le tableau trié serait uniquement contenir les idx classées en fonction de la buddy_name. J'ai oublié de mentionner que les nouveaux avatars sont ajoutés à la structure après l'initialisation...
Il s'agit probablement de travail et si vous cachez à l'intérieur d'un objet ensuite, vous pouvez ajouter de nouvelles entrées à travers une méthode sur cet objet et s'assurer que tout reste synchronisé.
OriginalL'auteur mu is too short