11
votes

Comment trier un objet js littéral?

Si j'ai cet objet JS Literal: xxx

Comment puis-je créer un nouvel objet triés littéral: xxx


1 commentaires

Vous ne pouvez pas trier un objet JS comme indiqué dans votre question. Impossible. Pourquoi? Parce que les propriétés de l'objet JS ne sont pas commandées. Passer à un tableau. Les matrices sont commandées, les objets ne sont pas.


3 Réponses :


8
votes

Les propriétés de l'objet ne sont pas une commande spécifique (la commande dépend de la mise en œuvre) et vous ne pouvez pas trier les propriétés.

Vous devez conserver un tableau de clés et trier en conséquence, par exemple: P>

var keys = [];

for(var key in obj) {
    if(obj.hasOwnProperty(key)) {
        keys.push(key);
    }
}

keys.sort(function(a, b) {
    return obj[a] - obj[b];
});


0 commentaires

12
votes

re: Comment trier un objet JS?

Réponse: Vous ne pouvez pas. Donc, au lieu de cela, vous avez besoin d'une structure de données plus sophistiquée. Vous avez de nombreuses options: p>

  1. Vous pouvez utiliser un tableau séparé pour maintenir l'ordre des clés de l'objet. (C'est ce que la réponse de @felix Kling démontre.) Bon: récupération rapide par commande ou nom. Mauvais: nécessite une deuxième structure de données qui doit être maintenue synchronisée avec le premier. Li>
  2. au lieu de l'objet de maintien de propriétés et de valeurs, les propriétés pourraient contenir des objets qui contiennent les valeurs et un ordre de tri. Bon: 1 structure de données. Recherche rapide par nom de propriété. Mauvais: recherche lente par ordre (besoin de numériser la structure). Tri lent. Li>
  3. Utilisez un tableau, avec des éléments constitués d'objets qui maintiennent la clé et la valeur. Bon: 1 structure de données. Recherche rapide par ordre. Tri rapide. Mauvais: recherche lente par nom de propriété (besoin de numériser la structure). LI> ol>

    Je recommande une solution 3 car il utilise la mécanique JS pour gérer la commande. p>

    Exemples: P>

    // Object holds sort order:  (Solution 2)
    var foo = {
      Suzy: {v: 4, order: 0},
      Billy: {v: 5, order: 1},
      Jimmy: {v: 2, order: 2},
      Sally: {v: 1, order: 3}
    };    
    
    // Array holds keys: (Solution 3)
    var woof = [
      {k: 'Suzy', v: 4},
      {k: 'Billy', v: 5},
      {k: 'Jimmy', v: 2},
      {k: 'Sally', v: 1}
    ];
    
    // Sort the woof array by the key names:
    woof.sort(function(a, b) {
      return a.k.localeCompare(b.k);
    });
    
    // The third key and value:
    woof[2].k; // the third key
    woof[2].v; // the third value
    


4 commentaires

Merci de me mettre sur la bonne voie et de tous les détails. Je vais essayer # 3.


Merci pour cela, j'aime aussi 3. Notez cependant que le tri ne semble pas fonctionner. Essayez woof.sort (fonction (a, b) {renvoyer a.k.localecomare (b.k);});


Je crée un énorme objet littéral d'une structure JSON. Mon problème est que je dois ajouter des propriétés aux objets imbriqués entre d'autres propriétés. Je leur ai donné des identités, mais ce n'est pas très bon parce que je dois faire une boucle récursive à travers tous les nœuds et ses enfants. Pourriez-vous suggérer une structure de données spéciale? Peut-être stocker des références d'objets dans une ordonnance?


@Philx_x Vous devez poser votre question comme une nouvelle question sur le débordement de la pile



1
votes

active la commande de la propriété objet est prévisible depuis ES2015. Qui est incroyable.

Vérifiez ici.


2 commentaires

Cela signifie-t-il que vous pouvez montrer comment trier l'objet?


Ceci est une réponse de liaison uniquement. Extraire ou intrépide les informations nécessaires et l'ajoutez à la réponse. Link Seules les réponses ne sont indésirables car elles sont inutiles lorsque le lien diminue. En règle générale, une réponse doit toujours tenir en soi sans s'appuyer sur des informations externes. Ajout d'un extrait de vue de la manière dont vous trieriez un objet aiderait cette réponse à une bonne affaire.