0
votes

Comment trier un objet par ses valeurs avec plusieurs clés?

Je veux utiliser la méthode de tri expliqué ici mais j'ai xxx pré>

J'ai créé cette fonction dans laquelle je regroupe toutes les chaînes ensemble et ajoutez un compte (comme valeur pour la clé, voir ci-dessus) P>

{
  "TUBE": 1,
  "DCS": 2,
  "BREAKOUT": 6,
  "RAISING": 8,
  "REAR": 61,
  "TOWER": 65,
  "JACKS": 84,
  "FEED": 114,
  "INSTALLATION": 119,
  "ASSEMBLY": 326,
  "JACK": 334,
  "HYDRAULIC": 1421,
  "CYLINDER": 2986
}


11 commentaires

Ne pense pas que vous pouvez trier un objet en JavaScript


Que veux-tu dire exactement? Vous avez un tableau d'objets comme ça?


Qu'essayez-vous de trier par? Par exemple, si la matrice contient l'objet que vous avez spécifié, plus celui qui est exactement identique à l'exception du tube est 5, votre objet vient-il avant le mien, mon objet vient-il avant le vôtre ou comptez-t-il comme étant égal?


Ils ne font pas dans l'exemple et s'ils l'ont fait, alors alphabétiquement serait ma suggestion


Trier () est pour les tableaux ..... Je crois que c'est un objet ... Trier () ne fonctionne pas avec des tableaux,


objet.keys (YourObj) .sort ((a, b) => Yourobj [a] - YourObj [B])


Veuillez afficher un exemple de votre sortie attendue


Enfin un exemple complet. C'est ce que je pensais que vous vouliez dire


Très désolé de ne pas dès le début décrivant ce que j'aimerais avoir comme résultat final.


Et juste un FYI: Tous les moteurs de navigateur / JS garantissent pas l'ordre d'objet. Donc, mieux d'utiliser une valorisation de matrice et de mappage.


S'appuyant sur l'ordre des propriétés d'objets des choses comme pour ... dans ou objet.keys () est une pratique très risquée et un sol fertile pour les bugs. Sémantiquement, une propriété est une propriété et l'ordre ne fait aucune différence dans la façon dont l'objet fonctionne réellement. Si vous voulez simplement faire cela à des fins de présentation, il existe des solutions plus simples.


5 Réponses :


0
votes

Comme expliqué dans le DOC que vous avez lié, la fonction trier code> accepte un argument, c'est-à-dire le comparateur. Donc, si vous souhaitez trier un éventail d'objet par la touche CODE> INSTALLATION CODE>, vous pouvez simplement faire:

array.sort(function(a,b) {return a.INSTALLATION - b.INSTALLATION})


1 commentaires

Valeurs. Je parie qu'il signifie trier de 1 à 2986



0
votes

combiner objet.keys (obj) code>, .sort () code> & .map code>

p>

const obj = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
}

var sorted = {};

console.log("Un-sorted", obj);

Object.keys(obj).sort().map(function(key){
  sorted[key] = obj[key];
});

console.log("Sorted", sorted)


1 commentaires

Qui trie par nom de clé, pas de valeur



1
votes

Te première chose que vous aurez besoin de faire est de transformer vos propriétés de vos objets en une matrice, quelque chose sous la forme xxx pré>

alors vous pouvez utiliser un tri. p>

var input = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
};

var result = Object.keys(input)
                   .map( x => ({word:x, count:input[x]}))
                   .sort( (a,b) => a.count - b.count);
console.log(result);


3 commentaires

Si vous modifiez la structure, vous pouvez également utiliser objet.entries () et bander le .map () appel: objet.tries (entrée). Trier ((A, B) => A [1] - B [1])


@Andreas, mais vous perdez la clé qui est nécessaire pour le résultat ... sauf si je manque quelque chose.


Object.entries () Retours: [[Clé, valeur], [Touche, valeur], ...]



3
votes

Unsing objet.keys () code> et mappe code> comme suit, vous pouvez atteindre votre résultat attendu.

const list = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
};

var newList = {};
Object.keys(list).sort(function(a,b){return list[a]-list[b]})
                 .map(key => newList[key] = list[key]);
console.log(newList);


4 commentaires

Nous avons finalement vu que c'est ce que l'OP signifiait. J'aurais aussi fait quelque chose comme ça aussi. Le puriste dira que vous ne pouvez pas compter sur la commande dans un objet de la valeur clé


L'OP a mis à jour sa question. J'ai pu obtenir son résultat attendu. Je ne suis pas sûr de ce que votre problème est.


Pas de problème. J'ai voté et applaudi. Mais comme je l'ai dit, Les gens ici affirmeront qu'on ne peut pas compter sur l'ordre dans une table de hachage


Peut-être que la carte est un peu trompeuse car vous utilisez un effet secondaire. Un foreach est plus approprié à mon avis mais tu étais toujours le premier à deviner / résoudre ce que OP voulait



2
votes

Object.entries et une foreach Depuis la carte n'est pas la méthode la plus pertinente pour copier des valeurs de clé

et comme Epascarello mentionné, vous êtes meilleur avec un tableau réel puisque vous ne devez pas compter sur l'ordre de clé dans un objet p >

p>

const list = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
},newList = {}

Object.entries(list).sort((a,b) => a[1]-b[1])
  .forEach(elm => newList[elm[0]] = elm[1])

console.log(newList);


0 commentaires