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" ];
3 Réponses :
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)
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é :)
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)
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
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);
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!