Tengo una serie de objetos que necesitan ordenarse por apellido, sin embargo, el objeto solo tiene parámetros de nombre y nombre completo, por lo que para el apellido tengo que usar fullname.replace((firstname + " "), "") . Ejemplo de matriz a continuación.
const names = [ { firstname: "John", fullname: "John Doe" }, { firstname: "Amber", fullname: "Amber Smith" }, { firstname: "Michael", fullname: "Michael Smith" }, { firstname: "Jessica", fullname: "Jessica Kelly Charles" } ]Si bien puedo usar "reemplazar" cada vez dentro de una función de comparación de clasificación, preferiría tener algo como esto:
names.sort(function(a, b) { const lastname = fullname.replace((firstname+ " "), ""); if (a.lastname < b.lastname) { return -1; } else if (a.lastname > b.lastname) { return 1; } return 0; });Obviamente, el apellido aparece como indefinido. Esto ha sido bastante difícil de buscar en Google, y creo que me faltan algunos conceptos básicos de JavaScript aquí, pero agradecería mucho su ayuda para ayudarme a aprender a escribir un mejor código.
Su mejor opción es modificar la fuente de la matriz para que almacene el lastname en el momento de la recopilación.
Si no puedes hacer eso:
A menos que haga un pase de preparación a través de su matriz agregando una propiedad de lastname , tendrá que calcularla cada vez que se llame a su devolución de llamada de sort , tanto para a como para b .
names.sort((a, b) => { const alast = a.fullname.replace(a.firstname + " "), ""); const blast = b.fullname.replace(b.firstname + " "), ""); return alast.localeCompare(blast); }); (Tenga en cuenta que usé localeCompare , que siempre es una mejor opción para nombres y otras cadenas de lenguaje natural que < y > . Por ejemplo, pregunte a los franceses si ç realmente debería ir después de z como lo hace con < y > . ;-) )
Sin embargo, eso volverá a calcular el lastname para el mismo objeto repetidamente, ya que el mismo objeto se puede pasar para sort (ya sea como a o b ) repetidamente. Si crees que eso puede ser un problema, podrías hacer el pase de preparación que mencioné:
// Build a map of entry to last names const lastnames = new Map(names.map(entry => { const lastname = entry.fullname.replace(entry.firstname + " ", ""); return [entry, lastname]; })); // sort names.sort((a, b) => { return lastnames.get(a).localeCompare(lastnames.get(b)); });Solo está declarando una nueva variable tratando de acceder a ella a través de la propiedad del objeto. Debe mapear sus datos en primer lugar como:
const names = [ { firstname: "John", fullname: "John Doe" }, { firstname: "Amber", fullname: "Amber Smith" }, { firstname: "Michael", fullname: "Michael Smith" }, { firstname: "Jessica", fullname: "Jessica Kelly Charles" } ].map(person => ({ ...person, lastName: person.fullName.replace(person.firstName + ' ', '') }));Después de mapear sus datos de esa manera, puede usar .lastName en el lugar que necesite.
names.sort(function(a, b) { if (a.lastName < b.lastName) { return -1; } else if (a.lastName > b.lastName) { return 1; } return 0; });