javascript - Sort array on key value -
i have function sorts name , array of value / key pairs.
i wonder how can pass key on sort being performed can call same function every time so:
var arr = [{name:'bob', artist:'rudy'}, {name:'johhny', artist:'drusko'}, {name:'tiff', artist:'needell'}, {name:'top', artist:'gear'}]; sort(arr, 'name'); //trying sort name sort(arr, 'artist'); //trying sort artist function sort(arr) { arr.sort(function(a, b) { var namea=a.name.tolowercase(), nameb=b.name.tolowercase(); if (namea < nameb) //sort string ascending return -1; if (namea > nameb) return 1; return 0; //default return value (no sorting) }); }
here 2 sorting functions may useful:
// sort on values function srt(desc) { return function(a,b){ return desc ? ~~(a < b) : ~~(a > b); }; } // sort on key values function keysrt(key,desc) { return function(a,b){ return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]); } } for array can sort on 'name' using:
var arr = [ {name:'bob', artist:'rudy'} ,{name:'johhny', artist:'drusko'} ,{name:'tiff', artist:'needell'} ,{name:'top', artist:'gear'}] .sort(keysrt('name')); you combine sorting functions:
function srt(desc,key) { return function(a,b){ return desc ? ~~(key ? a[key]<b[key] : < b) : ~~(key ? a[key] > b[key] : > b); }; } and use
var arr = [ {name:'bob', artist:'rudy'} ,{name:'johhny', artist:'drusko'} ,{name:'tiff', artist:'needell'} ,{name:'top', artist:'gear'}] .sort(srt(null,'name')); here's kind of in 1 solution:
function srt(on,descending) { on = on && on.constructor === object ? on : {}; return function(a,b){ if (on.string || on.key) { = on.key ? a[on.key] : a; = on.string ? string(a).tolowercase() : a; b = on.key ? b[on.key] : b; b = on.string ? string(b).tolowercase() : b; // if key not present, move end if (on.key && (!b || !a)) { return !a && !b ? 1 : !a ? 1 : -1; } } return descending ? ~~(on.string ? b.localecompare(a) : < b) : ~~(on.string ? a.localecompare(b) : > b); }; } // usage examples 'a,z,x,y,a,b,b,z,a,i,j,y'.split(',').sort( srt({string:true;}) ); //=> ,a,a,b,b,i,j,x,y,y,z,z [100,7,8,2,2,0,5,1,6,5,-1].sort( srt() ); //=> -1,0,1,2,2,5,5,6,7,8,100 [100,7,8,2,2,0,5,1,6,5,-1].sort( srt({},true}) ); //=> 100,8,7,6,5,5,2,2,1,0,-1 var objarr = [ {name:'bob', artist:'rudy'} ,{name:'johhny', artist:'drusko'} ,{name:'tiff', artist:'needell'} ,{name:'top', artist:'gear'}] .sort( srt({key:'name',string:true}, true) ); (var i=0;i<objarr.length;i+=1) { console.log(objarr[i].name); } //=> logs zeb, top, tiff, johnny consecutively
Comments
Post a Comment