Ordenar esta matriz de objetos funciona si mapeo los objetos primero:
let data = [{ "date": "2018-07-31T00:00:00Z" }, { date: undefined }, { "date": "2020-07-01T00:00:00Z" }, { "date": "2019-08-24T11:16:26Z" }, { "date": "2011-11-19T00:00:00Z" }] let compare = (a, b) => { if (a < b) return 1; if (a > b) return -1; return 0 } // Note: Use map first let result = data.map(x=>x.date); console.log(result.sort(compare))Pero si ordeno esta matriz sin mapear los objetos primero, la ordenación no funciona:
let data = [{ "date": "2018-07-31T00:00:00Z" }, { date: undefined }, { "date": "2020-07-01T00:00:00Z" }, { "date": "2019-08-24T11:16:26Z" }, { "date": "2011-11-19T00:00:00Z" }] // Similar compare function just adapted let compare = (a, b) => { if (a.date < b.date) return 1; if (a.date > b.date) return -1; return 0 } // Note: No map let result = data; console.log(result.sort(compare))No puedo ver por qué sucede esto?
El problema es el objeto donde la fecha no está definida. En el primer ejemplo (con .map() ), todos los valores son cadenas o uno indefinido. Según la especificación de Array.prototype.sort() :
"todos los elementos indefinidos se ordenan al final de la matriz, sin llamar a compareFunction"
( MDN )
En el primer ejemplo, la función nunca se llama para el valor indefinido, por lo que se ordena en último lugar. Sin embargo, en el segundo ejemplo, cada vez que obtiene a.date en el valor indefinido, obtiene indefinido. Ambas declaraciones if en la función de ordenación se resuelven en false ya que undefined no puede ser menor o mayor que una cadena. Por lo tanto, se devuelve 0 continuamente para los siguientes elementos. Lo undefined permanece en su lugar y rompe el resto de la clasificación.