Digamos que tengo una variedad de objetos
[ { "name": "John", "height": "172", "weight": "87" }, { "name": "Tom", "height": "167", "weight": "67" }, { "name": "James", "height": "156", "weight": "uknown" }, { "name": "Jeremy", "height": "unknown", "weight": "85" }, ] Ahora, si quiero ordenarlos por altura, puedo hacer persons.sort((a, b) => b.height - a.height); igualmente si quiero ordenarlos por peso puedo hacer lo mismo pero con peso persons.sort((a, b) => b.weight - a.weight);
Hasta ahora, esto funcionaría bien, sin embargo, algunos de los valores son desconocidos, y si mantengo esta matriz en algún estado y los clasifico por los valores desconocidos, lo estropeo y no se ordena correctamente. En un caso en el que hay muchos más objetos que 4, se ordena hasta cierto punto, pero tan pronto como toca un objeto con una propiedad desconocida, lo estropea y el resto de la matriz no se ordena correctamente. ¿Cómo puedo superar esto? ¿Quizás haciendo algo empujando los artículos con valor desconocido en la parte inferior?
Todo lo que tiene que hacer es manejar los casos específicos cuando se unknown la altura/peso y devolver el valor apropiado
Por ejemplo:
const items = [ { "name": "John", "height": "172", "weight": "87" }, { "name": "Tom", "height": "167", "weight": "67" }, { "name": "James", "height": "156", "weight": "uknown" }, { "name": "Jeremy", "height": "unknown", "weight": "85" }, { "name": "Jeremy2", "height": "162", "weight": "85" }, { "name": "Jeremy3", "height": "unknown", "weight": "85" }, ]; items.sort((a,b) => { if(b.height === 'unknown' && a.height ==='unknown') return 0; else if(b.height === 'unknown') return -1; else if(a.height === 'unknown') return 1; else return a.height - b.height; }); console.log(items);La función de comparación compare(a, b) funciona así:
if return value sort > 0, sort b before a. else if return value sort < 0, sort a before b. else if return value === 0 keep original order of a and b.Editar:
Si se trata de cadenas separadas por comas, se convierte primero en número:
items.sort((a,b) => { if(b.height === 'unknown' && a.height ==='unknown') return 0; else if(b.height === 'unknown') return -1; else if(a.height === 'unknown') return 1; else return parseFloat(a.height.replace(/,/g, '')) - parseFloat(b.height.replace(/,/g, '')) });