2010-03-17 4 views
50

que je dois faire ceci:liste d'objets Javascript tri par la propriété d'objets

(désolé pas javascript objet syntaxe-encore l'apprentissage des langues :))

objet = voiture

attibutes: haut débit , marque ....

maintenant je veux trier la liste de ces voitures dans l'ordre par haut débit, marque ...

Comment puis-je faire cela (la solution s'il vous plaît remarquer doit être Javascri pt seulement, pas de php ou autre)?

+3

@durilai: JavaScript ** est ** orienté objet, le modèle OO de JavaScript est basé sur * Prototypage * et est vraiment, vraiment polyvalent ... http://en.wikipedia.org/wiki/ La programmation à base de prototypes – CMS

+5

sent le travail à la maison? – Cheeso

+0

Je recommande d'utiliser lodash.js: https: // lodash.com/docs # sortBy –

Répondre

118

javascript a la fonction sort qui peut prendre une autre fonction en paramètre - cette deuxième fonction est utilisée pour comparer deux éléments.

Exemple:

cars = [ 

    { 
     name: "Honda", 
     speed: 80 
    }, 

    { 
     name: "BMW", 
     speed: 180 
    }, 

    { 
     name: "Trabi", 
     speed: 40 
    }, 

    { 
     name: "Ferrari", 
     speed: 200 
    } 
] 


cars.sort(function(a, b) { 
    return a.speed - b.speed; 
}) 

for(var i in cars) 
    document.writeln(cars[i].name) // Trabi Honda BMW Ferrari 

ok, de votre commentaire, je vois que vous utilisez le mot « genre » dans un mauvais sens. En programmation "trier" signifie "mettre les choses dans un certain ordre", pas "organiser les choses en groupes". Ce dernier est beaucoup plus simple - c'est à quel point vous « trier » les choses dans le monde réel

  • faire deux tableaux vides (« boîtes »)
  • pour chaque objet dans votre liste, vérifier si elle correspond aux critères
  • si oui, le mettre dans la première « boîte »
  • si non, mettre dans la seconde « boîte »
+1

Semble très utile, mais je ne suis pas sûr que cela va faire, vous voyez que je dois suivre avec ceci: (disons par exemple) si (roues <15) { voitures-roues = petit; } else { voiture roues = grand } et que de créer 2 nouvelles listes basées sur la taille de la roue – Constructor

+4

note simple pour des raisons pratiques: ce ('a.someProp - b.someProp') sortes de ** bas au plus élevé **, et l'inverse ('b.someProp - a.someProp') trie du plus haut au plus bas. Fondamentalement, [si la fonction renvoie moins de 0, un vient avant b.] (Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Description) – user568458

14

Exemple.

Cela fonctionne sur cscript.exe, sous Windows.

// define the Car class 
(function() { 
    // makeClass - By John Resig (MIT Licensed) 
    // Allows either new User() or User() to be employed for construction. 
    function makeClass(){ 
     return function(args){ 
      if (this instanceof arguments.callee) { 
       if (typeof this.init == "function") 
        this.init.apply(this, (args && args.callee) ? args : arguments); 
      } else 
       return new arguments.callee(arguments); 
     }; 
    } 

    Car = makeClass(); 

    Car.prototype.init = function(make, model, price, topSpeed, weight) { 
     this.make = make; 
     this.model = model; 
     this.price = price; 
     this.weight = weight; 
     this.topSpeed = topSpeed; 
    }; 
})(); 


// create a list of cars 
var autos = [ 
    new Car("Chevy", "Corvair", 1800, 88, 2900), 
    new Car("Buick", "LeSabre", 31000, 138, 3700), 
    new Car("Toyota", "Prius", 24000, 103, 3200), 
    new Car("Porsche", "911", 92000, 155, 3100), 
    new Car("Mercedes", "E500", 67000, 145, 3800), 
    new Car("VW", "Passat", 31000, 135, 3700) 
]; 

// a list of sorting functions 
var sorters = { 
    byWeight : function(a,b) { 
     return (a.weight - b.weight); 
    }, 
    bySpeed : function(a,b) { 
     return (a.topSpeed - b.topSpeed); 
    }, 
    byPrice : function(a,b) { 
     return (a.price - b.price); 
    }, 
    byModelName : function(a,b) { 
     return ((a.model < b.model) ? -1 : ((a.model > b.model) ? 1 : 0)); 
    }, 
    byMake : function(a,b) { 
     return ((a.make < b.make) ? -1 : ((a.make > b.make) ? 1 : 0)); 
    } 
}; 

function say(s) {WScript.Echo(s);} 

function show(title) 
{ 
    say ("sorted by: "+title); 
    for (var i=0; i < autos.length; i++) { 
     say(" " + autos[i].model); 
    } 
    say(" "); 
} 

autos.sort(sorters.byWeight); 
show("Weight"); 

autos.sort(sorters.byModelName); 
show("Name"); 

autos.sort(sorters.byPrice); 
show("Price"); 

Vous pouvez également créer un trieur général.

var byProperty = function(prop) { 
    return function(a,b) { 
     if (typeof a[prop] == "number") { 
      return (a[prop] - b[prop]); 
     } else { 
      return ((a[prop] < b[prop]) ? -1 : ((a[prop] > b[prop]) ? 1 : 0)); 
     } 
    }; 
}; 

autos.sort(byProperty("topSpeed")); 
show("Top Speed"); 
+0

Nice un. Mais je n'aime pas imbriquer les expressions ternaires, et le bloc else n'est pas strictement nécessaire après un retour. – Marcs

+0

Je suppose que vous le savez, mais pour les gens qui regardent 'nouvelle voiture (" Chevy "," Corvair ", 1800, 88, 2900),' peut aussi être 'Car (" Chevy "," Corvair ", 1800, 88, 2900), 'sans le' nouveau'. Bonne réponse je pense. –

-1

J'ai écrit cette fonction simple pour moi-même:

function sortObj(list, key) { 
    function compare(a, b) { 
     a = a[key]; 
     b = b[key]; 
     var type = (typeof(a) === 'string' || 
        typeof(b) === 'string') ? 'string' : 'number'; 
     var result; 
     if (type === 'string') result = a.localeCompare(b); 
     else result = a - b; 
     return result; 
    } 
    return list.sort(compare); 
} 

par exemple, vous avez la liste des voitures:

var cars= [{brand: 'audi', speed: 240}, {brand: 'fiat', speed: 190}]; 
var carsSortedByBrand = sortObj(cars, 'brand'); 
var carsSortedBySpeed = sortObj(cars, 'speed'); 
+0

pourquoi ce commentaire est-il voté -2? Je pense que c'est une bonne réponse peut-être pas la plus claire mais la réponse la plus dynamique. – wertigom

2

Une version de la solution Cheeso avec tri inverse, j'ai aussi retiré les expressions ternaires par manque de clarté (mais c'est un goût personnel).

function(prop, reverse) { 
    return function(a, b) { 
    if (typeof a[prop] === 'number') { 
     return (a[prop] - b[prop]); 
    } 

    if (a[prop] < b[prop]) { 
     return reverse ? 1 : -1; 
    } 

    if (a[prop] > b[prop]) { 
     return reverse ? -1 : 1; 
    } 

    return 0; 
    }; 
}; 
+0

Bon pour l'exemple inverse –

+1

Pour être complètement inversés, les nombres doivent être 'return !! reverse? (un [prop] - b [prop]) * -1: (un [prop] - b [prop]); ' –

+0

Oui, comme maintenant pas de vérification inverse sur les chiffres, merci, je devrais corriger cela. Mais pourquoi le double '!' C'est bien aussi: 'return reverse? (un [prop] - b [prop]) * -1: (un [prop] - b [prop]); ' – Marcs