11 votes

Trier les tableaux javascript dans un ordre prédéfini

J'ai un javascript array que je dois trier dans un ordre prédéfini. Cela semble aléatoire, mais ils doivent être classés dans un ordre spécifique.

C'est ici que j'ai commencé, mais je ne sais pas comment finir :

// Items
var items = ["Apples", "Oranges", "Grapes", "Peaches", "Bananas", "Watermelon"];
var itemsOrdered = {};

// Order how I want them
for (i in items) {
    var item = items[i];
    if (item == 'Apples') {
        itemsOrdered['4'] = item;
    } else if (item == 'Oranges') {
        itemsOrdered['2'] = item;
    } else if (item == 'Grapes') {
        itemsOrdered['1'] = item;
    } else if (item == 'Peaches') {
        itemsOrdered['3'] = item;
    } else if (item == 'Bananas') {
        itemsOrdered['6'] = item;
    } else if (item == 'Watermelon') {
        itemsOrdered['5'] = item;
    }
}

L'ordre devrait être le suivant :

  • Pommes : 4
  • Oranges : 2
  • Raisins : 1
  • Pêches : 3
  • Bananes : 6
  • Pastèque : 5

Tous ces éléments ne se trouvent pas toujours dans le tableau. Il peut n'y avoir que des pommes et des bananes, mais ils ont toujours besoin des mêmes positions de tri.

Je dois définir cet ordre de tri manuel après la création du tableau car notre système les imprime dans un ordre aléatoire que nous devons ensuite trier correctement.

Au final, j'ai besoin de récupérer les fruits correctement triés dans un tableau.

Des idées ?

13voto

iamnotmaynard Points 3440

Placez votre commande dans un objet, comme ceci :

var ordering = {};
ordering["Apples"] = 4;
ordering["Oranges"] = 2;
... // etc.

Ensuite, triez vos items en utilisant Array.sort(compareFunction(a, b)) en lui transmettant une fonction de tri pour vérifier les objets. ordering (laissé à titre d'exercice). Vérifier https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort pour voir comment compareFunction() est utilisé.

Edit : Voici une mise en œuvre :

var ordering = {"Apples":4, "Oranges":2, "Grapes":1, 
                "Peaches":3, "Bananas":6, "Watermelons":5};
var items = ["Apples", "Oranges", "Grapes", 
             "Peaches", "Bananas", "Watermelons"];
items.sort(function(a,b) { return ordering[a] - ordering[b]; })
> ["Grapes", "Oranges", "Peaches", "Apples", "Watermelons", "Bananas"]

13voto

Ian Points 23712

Essayez :

var items = ["Apples", "Bananas", "Watermelons"];
var itemsOrdered = [];
var theOrder = ["Grapes", "Oranges", "Peaches", "Apples", "Watermelons", "Bananas"];

for (var i = 0; i < theOrder.length; i++) {
    if (items.indexOf(theOrder[i]) > -1) {
        itemsOrdered.push(theOrder[i]);
    }
}

console.log(itemsOrdered);

DEMO : http://jsfiddle.net/JPNGS/

L'ordre est défini dans theOrder . items contient les éléments disponibles. itemsOrdered contient les éléments disponibles, ordonnés.

0voto

zap Points 11

Commencez par convertir votre objet en tableau :

var sortOrder = [];

for (i in itemsOrdered)
    sortOrder[i-1] = itemsOrdered[i];

Ensuite, utilisez .filter() comme ceci :

var result = sortOrder.filter(item) {
    return items.indexOf(item) !== -1;
});

-2voto

Niet the Dark Absol Points 154811

Votre code se simplifie à :

var itemsOrdered = {1:"Peaches",2:"Oranges",3:"Grapes",4:"Apples",5:"Watermelon",6:"Bananas"};

En d'autres termes, c'est totalement inutile. Il suffit de les définir dans l'ordre souhaité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X