A função a seguir permitirá classificar uma matriz de objetos em uma ou várias propriedades, crescente (padrão) ou decrescente em cada propriedade, além de permitir que você escolha se deseja ou não realizar comparações que diferenciam maiúsculas de minúsculas. Por padrão, essa função executa classificações sem distinção entre maiúsculas e minúsculas.
O primeiro argumento deve ser a matriz que contém os objetos. O (s) argumento (s) subseqüente (s) deve ser uma lista separada por vírgula de seqüências de caracteres que fazem referência às diferentes propriedades do objeto a serem classificadas. O último argumento (que é opcional) é um booleano para escolher se você deve ou não classificar com distinção entre maiúsculas e minúsculas - use true
para classificações com distinção entre maiúsculas e minúsculas.
A função classificará cada propriedade / chave em ordem crescente por padrão. Se você quer uma tecla específica para classificar em ordem decrescente, em seguida, passar em vez de uma matriz neste formato: ['property_name', true]
.
Aqui estão alguns exemplos de usos da função, seguidos por uma explicação (onde homes
está uma matriz que contém os objetos):
objSort(homes, 'city')
-> classificar por cidade (crescente, sensível a maiúsculas e minúsculas)
objSort(homes, ['city', true])
-> classificar por cidade (decrescente, diferencia maiúsculas de minúsculas)
objSort(homes, 'city', true)
-> classificar por cidade e preço (crescente, diferenciando maiúsculas de minúsculas )
objSort(homes, 'city', 'price')
-> classificar por cidade e preço (ambos em ordem crescente, diferenciando maiúsculas de minúsculas)
objSort(homes, 'city', ['price', true])
-> classificar por cidade (crescente) e preço (decrescente), diferenciando maiúsculas de minúsculas)
E sem mais delongas, aqui está a função:
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
E aqui estão alguns dados de exemplo:
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
}];