Sorting objects by property values Sorting objects by property values arrays arrays

Sorting objects by property values


javascript has the sort function which can take another function as parameter - that second function is used to compare two elements.

Example:

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, from your comment i see that you're using the word 'sort' in a wrong sense. In programming "sort" means "put things in a certain order", not "arrange things in groups". The latter is much simpler - this is just how you "sort" things in the real world

  • make two empty arrays ("boxes")
  • for each object in your list, check if it matches the criteria
  • if yes, put it in the first "box"
  • if no, put it in the second "box"


Example.

This runs on cscript.exe, on 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 carsvar 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 functionsvar 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");

You can also make a general sorter.

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");


I have wrote this simple function for myself:

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);}

for example you have list of cars:

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