javascript - Ordenar un arreglo primero por columna booleana y luego por columna de cadena
Estoy tratando de ordenar un arreglo por 2 campos. Tengo un booleano: isFavorite y una cadena: name. Todos los booleanos que son true tienen que ser los primeros elementos. Pero quiero que el arreglo sea alfabético. Este es mi código hasta ahora (probé múltiples cosas):
data.sort(function (x,y) {
if (x.isFavorite){
return -1;
}
if (x.isFavorite && !y.isFavorite && (x.name < y.name)){
return -1;
} else if ((x.isFavorite === y.isFavorite) && (x.name === y.name)){
return 0;
} else if (x.isFavorite && y.isFavorite && (x.name < y.name)){
return -1;
} else if (!x.isFavorite && !y.isFavorite && (x.name > y.name)){
return 1;
}
}
Respuesta #1
¿Por qué tantas condiciones y superposiciones?
Simplemente usa el operador OR lógico para ordenar un arreglo por dos campos.
Además, usé + (Booleano) para forzar la conversión a Número.
grouperArray.sort((a, b) => (+a.isFavorite) - (+b.isFavorite) || a.name.localeCompare(b.name));
let data = [{ isFavorite:false, name:'A' }, { isFavorite:true, name:'C' }, { isFavorite:true, name:'B' }];
data.sort((a,b) => (+b.isFavorite) - (+a.isFavorite) || a.name.localeCompare(b.name));
console.log(data);Respuesta #2
const data = [
{isFavorite: false, name: 'b'},
{isFavorite: false, name: 'f'},
{isFavorite: true, name: 'c'},
{isFavorite: true, name: 'a'},
{isFavorite: false, name: 'd'},
{isFavorite: true, name: 'g'}
];
const sortedData = data.sort((a, b) => {
if (a.isFavorite !== b.isFavorite) {
return a.isFavorite ? -1 : 1;
} else {
return a.name > b.name ? 1 : -1;
}
});
console.log(sortedData);