Say I have an array of Employee Objects:
var Employee = function(fname, age) {
this.fname = fname;
this.age = age;
}
var employees = [
new Emplo
I provide my own sortBy method for arrays that lets you specify an arbitrary number of fields to sort by, using a Schwartzian transform:
var a=[ {c:"GK",age:37}, {c:"ZK",age:13}, {c:"TK",age:14}, {c:"AK",age:13} ];
a.sortBy( function(){ return this.age } );
// [ {c:"ZK",age:13}, {c:"AK",age:13}, {c:"TK",age:14}, {c:"GK",age:37} ]
a.sortBy( function(){ return [this.age,this.c] } );
// [ {c:"AK",age:13}, {c:"ZK",age:13}, {c:"TK",age:14}, {c:"GK",age:37} ]
a.sortBy( function(){ return -this.age } );
// [ {c:"GK",age:37}, {c:"TK",age:14}, {c:"ZK",age:13}, {c:"AK",age:13} ]
var n=[ 1, 99, 15, "2", "100", 3, 34, "foo", "bar" ];
n.sort();
// [ 1, "100", 15, "2", 3, 34, 99, "bar", "foo" ]
n.sortBy( function(){ return this*1 } );
// [ "foo", "bar", 1, "2", 3, 15, 34, 99, "100" ]
n.sortBy( function(o){ return [typeof o,this] } );
// [1, 3, 15, 34, 99, "100", "2", "bar", "foo"]
n.sortBy(function(o){ return [typeof o, typeof o=="string" ? o.length : o] })
// [1, 3, 15, 34, 99, "2", "100", "bar", "foo"]
(function(){
// This code is copyright 2012 by Gavin Kistner, !@phrogz.net
// License: http://phrogz.net/JS/_ReuseLicense.txt
if (typeof Object.defineProperty === 'function'){
try{Object.defineProperty(Array.prototype,'sortBy',{value:sb}); }catch(e){}
}
if (!Array.prototype.sortBy) Array.prototype.sortBy = sb;
function sb(f){
for (var i=this.length;i;){
var o = this[--i];
this[i] = [].concat(f.call(o,o,i),o);
}
this.sort(function(a,b){
for (var i=0,len=a.length;i