4
votes

Comment trier un tableau d'objets avec le javascript de la boucle forEach

J'ai un tableau qui ressemble à ceci:

order.forEach(name => {
      sortedData = [...this.data].sort(function(obj1, obj2) {
            return (
              -(obj1.name)  || obj2.score < obj1.score
            );
          });
        });
console.log(sortedData);

Ce tableau contient les valeurs d'attribut sur lesquelles je voudrais trier mon tableau d'objets. Je veux trier les données pour que tous les objets avec le nom "foo" soient en premier, puis "bar", puis "baz". Mon tableau d'objets ressemble à ceci:

sortedData =  [ 
    {name: "foo", score: 8},
    {name: "foo", score: 6},  
    {name: "bar", score: 9},
    {name: "baz", score: 9},
    {name: "baz", score: 4} 
];

Je veux que l'ordre des données ressemble à ceci, le tableau est ordonné par nom mais aussi par score desc lorsque le les noms sont les mêmes:

data = [ 
    {name: "foo", score: 8},
    {name: "baz", score: 4},
    {name: "baz", score: 9}, 
    {name: "foo", score: 6}, 
    {name: "bar", score: 9} 
];

Voici le code que j'ai essayé jusqu'à présent:

order = [ "foo", "bar", "baz" ];


1 commentaires

Si vous ne voulez pas que le tableau d'origine soit muté et qu'un nouveau tableau trié soit renvoyé, veuillez également vérifier ma réponse!


3 Réponses :


1
votes

Utilisez l'index pour trier en fonction de l'ordre, pour obtenir l'index, vous pouvez utiliser Méthode Array # indexOf . Pour trier en fonction du nombre, renvoyez simplement la différence.

let order = ["foo", "bar", "baz"];
let data = [{
    name: "foo",
    score: 8
  },
  {
    name: "baz",
    score: 4
  },
  {
    name: "baz",
    score: 9
  },
  {
    name: "foo",
    score: 6
  },
  {
    name: "bar",
    score: 9
  }
];


data.sort(({ name: a, score : as }, { name: b ,score:bs}) => order.indexOf(a) - order.indexOf(b) || bs - as)

console.log(data)

//  extract object properties for comparing
// return difference of indexes to sort based on that
// in case indexes are same return difference of score(to sort element with same name) 
data.sort(({ name: a, score: as }, { name: b ,score: bs}) => order.indexOf(a) - order.indexOf(b) || bs - as)


5 commentaires

Merci pour votre réponse, comment puis-je également trier par score, lorsque le code "baz" n'est pas trié par score aussi


@TeamCafe: mis à jour, de toute façon ascendant ou descendant?


Par ordre décroissant pour que le plus gros score soit en haut


@TeamCafe: terminé :)


@TeamCafe: heureux que cela ait aidé :)



1
votes

Vous pouvez simplement utiliser sort et indexOf

let order = [ "foo", "bar", "baz" ];

let data = [ 
    {name: "foo", score: 8},
    {name: "baz", score: 4},
    {name: "baz", score: 9}, 
    {name: "foo", score: 6}, 
    {name: "bar", score: 9} 
];

let op = data.sort((a,b)=> (order.indexOf(a.name) - order.indexOf(b.name)) || b.score - a.score )

console.log(op)


3 commentaires

Merci pour votre réponse mais le résultat de l'extrait de code ne semble pas avoir les objets du nom "baz" triés par score décroissant


@TeamCafe dans l'extrait de code, il est là uniquement dans l'ordre décroissant. contre-vérifier une fois de plus mtae :)


Merci beaucoup, désolé: D



0
votes

Nous pouvons utiliser les indices du tableau dans le tableau d'ordre pour le tri. Utilisation également de l'affectation de déstructuration d'objet pour obtenir les clés d'objet pour comparaison Si la première comparaison de la clé name aboutit à l'égalité des deux clés, alors optez pour le deuxième critère de la clé score .

Dans ma réponse, je n'ai pas muter le tableau d'origine, si ce type de comportement est nécessaire, vous pouvez vérifier cette solution:

const order = [ "foo", "bar", "baz" ];
const data = [ 
    {name: "foo", score: 8},
    {name: "baz", score: 4},
    {name: "baz", score: 9}, 
    {name: "foo", score: 6}, 
    {name: "bar", score: 9} 
];
function sortArray(data, order){
  const sortedArr = Array.from(data).sort(({name: name1, score: score1},{name: name2, score: score2}) =>{
     return name1 === name2 ? score2 - score1 : order.indexOf(name1) - order.indexOf(name2);
  });
  return sortedArr;
}
console.log("***Sorted Array***");
console.log(sortArray(data, order));
console.log("***Original Array***");
console.log(data);


0 commentaires