La fonction suivante vous permettra de trier un tableau d'objets sur une ou plusieurs propriétés, par ordre croissant (par défaut) ou décroissant sur chaque propriété, et vous permettra de choisir d'effectuer ou non des comparaisons sensibles à la casse. Par défaut, cette fonction effectue des tris insensibles à la casse.
Le premier argument doit être le tableau contenant les objets. Le ou les arguments suivants doivent être une liste de chaînes séparées par des virgules qui référencent les différentes propriétés d'objet à trier. Le dernier argument (qui est facultatif) est un booléen pour choisir d'effectuer ou non des tris sensibles à la casse - à utiliser true
pour les tris sensibles à la casse.
La fonction triera chaque propriété / clé par ordre croissant par défaut. Si vous voulez une clé particulière pour trier par ordre décroissant, puis passer à la place dans un tableau dans ce format: ['property_name', true]
.
Voici quelques exemples d'utilisation de la fonction suivis d'une explication (où se homes
trouve un tableau contenant les objets):
objSort(homes, 'city')
-> trier par ville (croissant, sensible à la casse)
objSort(homes, ['city', true])
-> trier par ville (décroissant, sensible à la casse)
objSort(homes, 'city', true)
-> trier par ville puis prix (croissant, sensible à la casse )
objSort(homes, 'city', 'price')
-> trier par ville puis prix (à la fois croissant, sensible à la casse)
objSort(homes, 'city', ['price', true])
-> trier par ville (croissant) puis prix (décroissant), sensible à la casse)
Et sans plus tarder, voici la fonction:
function objSort() {
var args = arguments,
array = args[0],
case_sensitive, keys_length, key, desc, a, b, i;
if (typeof arguments[arguments.length - 1] === 'boolean') {
case_sensitive = arguments[arguments.length - 1];
keys_length = arguments.length - 1;
} else {
case_sensitive = false;
keys_length = arguments.length;
}
return array.sort(function (obj1, obj2) {
for (i = 1; i < keys_length; i++) {
key = args[i];
if (typeof key !== 'string') {
desc = key[1];
key = key[0];
a = obj1[args[i][0]];
b = obj2[args[i][0]];
} else {
desc = false;
a = obj1[args[i]];
b = obj2[args[i]];
}
if (case_sensitive === false && typeof a === 'string') {
a = a.toLowerCase();
b = b.toLowerCase();
}
if (! desc) {
if (a < b) return -1;
if (a > b) return 1;
} else {
if (a > b) return -1;
if (a < b) return 1;
}
}
return 0;
});
} //end of objSort() function
Et voici quelques exemples de données:
var homes = [{
"h_id": "3",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": 162500
}, {
"h_id": "4",
"city": "Bevery Hills",
"state": "CA",
"zip": "90210",
"price": 1000000
}, {
"h_id": "5",
"city": "new york",
"state": "NY",
"zip": "00010",
"price": 1000000
}, {
"h_id": "6",
"city": "Dallas",
"state": "TX",
"zip": "85000",
"price": 300000
}, {
"h_id": "7",
"city": "New York",
"state": "NY",
"zip": "00020",
"price": 345000
}];