J'ai une fonction qui trie actuellement par nom et un tableau de paires valeur/clé.
Je me demande comment puis-je transmettre la clé sur le type en cours pour pouvoir appeler la même fonction à chaque fois,
var arr = [{name:'bob', artist:'rudy'},
{name:'johhny', artist:'drusko'},
{name:'tiff', artist:'needell'},
{name:'top', artist:'gear'}];
sort(arr, 'name'); //trying to sort by name
sort(arr, 'artist'); //trying to sort by 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)
});
}
Voici deux fonctions de tri qui peuvent être utiles:
// 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]);
}
}
Pour votre tableau, vous pouvez trier par 'nom' en utilisant:
var arr = [ {name:'bob', artist:'rudy'}
,{name:'johhny', artist:'drusko'}
,{name:'tiff', artist:'needell'}
,{name:'top', artist:'gear'}]
.sort(keysrt('name'));
Vous pouvez également combiner les fonctions de tri:
function srt(desc,key) {
return function(a,b){
return desc ? ~~(key ? a[key]<b[key] : a < b)
: ~~(key ? a[key] > b[key] : a > b);
};
}
Et utilise
var arr = [ {name:'bob', artist:'rudy'}
,{name:'johhny', artist:'drusko'}
,{name:'tiff', artist:'needell'}
,{name:'top', artist:'gear'}]
.sort(srt(null,'name'));
Voici une sorte de solution tout en un:
function srt(on,descending) {
on = on && on.constructor === Object ? on : {};
return function(a,b){
if (on.string || on.key) {
a = on.key ? a[on.key] : a;
a = on.string ? String(a).toLowerCase() : a;
b = on.key ? b[on.key] : b;
b = on.string ? String(b).toLowerCase() : b;
// if key is not present, move to the end
if (on.key && (!b || !a)) {
return !a && !b ? 1 : !a ? 1 : -1;
}
}
return descending ? ~~(on.string ? b.localeCompare(a) : a < b)
: ~~(on.string ? a.localeCompare(b) : a > 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) );
for (var i=0;i<objarr.length;i+=1) {
console.log(objarr[i].name);
}
//=> logs zeb, top, Tiff, Johnny consecutively
Array.prototype.sortOn = function(key){
this.sort(function(a, b){
if(a[key] < b[key]){
return -1;
}else if(a[key] > b[key]){
return 1;
}
return 0;
});
}
var arr = [{name:'bob', artist:'rudy'},{name:'johhny', artist:'drusko'},{name:'tiff', artist:'needell'},{name:'top', artist:'gear'}];
arr.sortOn("name");
arr.sortOn("artist");
function keysrt(key) {
return function(a,b){
if (a[key] > b[key]) return 1;
if (a[key] < b[key]) return -1;
return 0;
}
}
someArrayOfObjects.sort(keysrt('text'));
Facilitez-vous la vie en utilisant une fermeture https://stackoverflow.com/a/31846142/1001405
Vous pouvez voir l'exemple de travail ici
var filter = 'name', //sort by name
data = [{name:'bob', artist:'rudy'},{name:'johhny', artist:'drusko'},{name:'tiff', artist:'needell'},{name:'top', artist:'gear'}];;
var compare = function (filter) {
return function (a,b) { //closure
var a = a[filter],
b = b[filter];
if (a < b) {
return -1;
}else if (a > b) {
return 1;
} else {
return 0;
}
};
};
filter = compare(filter); //set filter
console.log(data.sort(filter));
En examinant toutes les réponses, j'ai proposé ma propre solution qui fonctionne avec plusieurs navigateurs. La solution acceptée ne fonctionne pas dans IE ou Safari. De plus, les autres solutions ne permettent pas de trier par ordre décroissant.
/*! FUNCTION: ARRAY.KEYSORT(); **/
Array.prototype.keySort = function(key, desc){
this.sort(function(a, b) {
var result = desc ? (a[key] < b[key]) : (a[key] > b[key]);
return result ? 1 : -1;
});
return this;
}
var arr = [{name:'bob', artist:'rudy'}, {name:'johhny', artist:'drusko'}, {name:'tiff', artist:'needell'}, {name:'top', artist:'gear'}];
arr.keySort('artist');
arr.keySort('artist', true);