tablas - recorrer tabla javascript
Ordenar la matriz por primer nombre(alfabéticamente) en Javascript (17)
Algo como esto:
array.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)
});
Obtuve una matriz (ver a continuación para un objeto en la matriz) que necesito ordenar por primer nombre usando JavaScript. ¿Cómo puedo hacerlo?
var user = {
bio: null,
email: "[email protected]",
firstname: "Anna",
id: 318,
lastAvatar: null,
lastMessage: null,
lastname: "Nickson",
nickname: "anny"
};
Básicamente, puede ordenar los arreglos con el método, pero si desea ordenar los objetos, debe pasar la función al método para ordenar los arreglos, así que le daré un ejemplo usando su arreglo.
user = [{
bio: "<null>",
email: "[email protected]",
firstname: ''Anna'',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: ''Nickson'',
nickname: ''anny''
},
{
bio: "<null>",
email: "[email protected]",
firstname: ''Senad'',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: ''Nickson'',
nickname: ''anny''
},
{
bio: "<null>",
email: "[email protected]",
firstname: ''Muhamed'',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: ''Nickson'',
nickname: ''anny''
}];
var ar = user.sort(function(a, b)
{
var nA = a.firstname.toLowerCase();
var nB = b.firstname.toLowerCase();
if(nA < nB)
return -1;
else if(nA > nB)
return 1;
return 0;
});
Bonito y pequeño ES6 un trazador de líneas:
users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);
El código más corto posible con ES6!
users.sort((a, b) => a.firstname.localeCompare(b.firstname))
String.prototype.localeCompare() el soporte básico es universal!
Empujó las respuestas superiores en un prototipo para ordenar por clave.
Array.prototype.alphaSortByKey= function (key) {
this.sort(function (a, b) {
if (a[key] < b[key])
return -1;
if (a[key] > b[key])
return 1;
return 0;
});
return this;
};
En caso de que estemos clasificando nombres o algo con caracteres especiales, como ñ o áéíóú (commons en español), podríamos usar los parámetros locales ( es para español en este caso) y opciones como esta:
let user = [{''firstname'': ''Az''},{''firstname'': ''Áb''},{''firstname'':''ay''},{''firstname'': ''Ña''},{''firstname'': ''Nz''},{''firstname'': ''ny''}];
user.sort((a, b) => a.firstname.localeCompare(b.firstname, ''es'', {sensitivity: ''base''}))
console.log(user)
Las opciones de locale oficiales se pueden encontrar aquí en iana , es (español), de (alemán), fr (francés). Sobre sensitivity base de sensitivity significa:
Solo las cadenas que difieren en letras base se comparan como desiguales. Ejemplos: a ≠ b, a = á, a = A.
En palabras simples puedes usar este método.
users.sort(function(a,b){return a.firstname < b.firstname ? -1 : 1});
Inspirado en this respuesta,
users.sort((a,b) => (a.firstname - b.firstname));
Podemos usar localeCompare pero necesitamos verificar las claves también para los valores falsey
El siguiente código no funcionará si falta una entrada lname.
obj.sort((a, b) => a.lname.localeCompare(b.lname))
Así que tenemos que comprobar el valor de falsey como abajo
let obj=[
{name:''john'',lname:''doe'',address:''Alaska''},
{name:''tom'',lname:''hopes'',address:''California''},
{name:''harry'',address:''Texas''}
]
let field=''lname'';
console.log(obj.sort((a, b) => (a[field] || "").toString().localeCompare((b[field] || "").toString())));
O
Podemos usar lodash, es muy simple. Detectará los valores devueltos, es decir, si es número o cadena y se ordenará en consecuencia.
import sortBy from ''lodash/sortBy'';
sortBy(obj,''name'')
Puede usar el método de matriz integrado - sort
. Este método toma un método de devolución de llamada como parámetro
// custom sort function to be passed as param/callback to the Array''s sort method
function myCustomSort(a, b) {
return (a.toLowerCase() > b.toLowerCase()) ? 1 : -1;
}
// Actual method to be called by entity that needs sorting feature
function sortStrings() {
var op = Array.prototype.sort.call(arguments, myCustomSort);
}
// Testing the implementation
var sortedArray = sortStrings("Burger", "Mayo1", "Pizza", "boxes", "Apples", "Mayo");
console.log(sortedArray); //["Apples", "boxes", "Burger", "Mayo", "Mayo1", "Pizza"]
Puntos clave a tener en cuenta para entender este código.
- El método personalizado, en este caso,
myCustomSort
, debe devolver +1 o -1 para cada comparación de pares de elementos (desde la matriz de entrada). - Use
toLowerCase()
/toUpperCase()
en el método de devolución de llamada de clasificación personalizado para que la diferencia de casos no afecte la corrección del proceso de clasificación.
Espero que esta explicación sea suficientemente clara. Siéntase libre de comentar si lo cree, se necesita más información.
¡Aclamaciones!
Puedes usar algo similar para deshacerte de las mayúsculas.
users.sort(function(a, b){
//compare two values
if(a.firstname.toLowerCase() < b.firstname.toLowerCase()) return -1;
if(a.firstname.toLowerCase() > b.firstname.toLowerCase()) return 1;
return 0;
})
Puedes usar esto para objetos
transform(array: any[], field: string): any[] {
return array.sort((a, b) => a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0);}
Si las cadenas comparadas contienen caracteres Unicode, puede usar la función localeCompare
de String
clase String
como la siguiente:
users.sort(function(a,b){
return a.firstname.localeCompare(b.firstname);
})
Supongamos que tiene una matriz de users
. Puede usar users.sort
y pasar una función que toma dos argumentos y compararlos (comparador)
Debería volver
- algo negativo si el primer argumento es menor que el segundo (debe colocarse antes del segundo en la matriz resultante)
- algo positivo si el primer argumento es mayor (debe colocarse después del segundo)
- 0 si esos dos elementos son iguales.
En nuestro caso, si dos elementos son a
y b
, queremos comparar a.firstname
y b.firstname
Ejemplo:
users.sort(function(a, b){
if(a.firstname < b.firstname) { return -1; }
if(a.firstname > b.firstname) { return 1; }
return 0;
})
Este código va a funcionar con cualquier tipo.
Tenga en cuenta que en la "vida real" ™ a menudo desea ignorar las mayúsculas y minúsculas, ordenar correctamente los signos diacríticos, símbolos extraños como ß, etc. al comparar cadenas, por lo que es posible que desee usar localeCompare
. Ver otras respuestas para mayor claridad.
Una notación más compacta:
user.sort(function(a, b){
return a.firstname == b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})
también para ambos tipos, asec y desc, u puede usar esto: supongamos que tenemos una variable SortType que especifica la clasificación ascendente o descendente que desea:
users.sort(function(a,b){
return sortType==="asc"? a.firstName.localeCompare( b.firstName): -( a.firstName.localeCompare( b.firstName));
})
underscorejs ofrece la muy buena función _.sortBy:
_.sortBy([{a:1},{a:3},{a:2}], "a")
o puedes usar una función de clasificación personalizada:
_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})