Tengo un programa de trabajo que cumple con las condiciones a continuación, pero me pregunto si existe una solución más eficiente. Actualmente, aplico 4 transformaciones de métodos de matriz de Javascript diferentes, lo que da como resultado la devolución de una nueva matriz para cada transformación para un total de 4 nuevas matrices. ¿Se pueden combinar estas transformaciones para crear solo 1 matriz adicional en lugar de 4 nuevas matrices? Podría encadenar las llamadas, pero estaba pensando que podría ser posible combinarlas todas en el método reduce(), pero no estoy seguro de cómo se vería o si hay alguna solución mejor.
Los criterios que deben cumplirse:
const GOOGLE_ORG = 'Google'; const employees = [ { id: 3, firstName: 'John', lastName: 'Doe', organization: 'Google', }, { id: 7, firstName: 'Jake', lastName: 'Smith', organization: 'Google', }, { id: 1, firstName: 'Jane', lastName: 'Doe', organization: 'Google', }, { id: 2, firstName: 'Vanessa', lastName: 'Smith', organization: 'Meta', }, { id: 5, firstName: 'Sarah', lastName: 'Hernandez', organization: 'Meta', }, { id: 8, firstName: 'Jessica', lastName: 'Morales', organization: 'Google', }, { id: 4, firstName: 'Paul', lastName: 'Stark', organization: 'Google', }, { id: 6, firstName: 'Peter', lastName: 'Brown', organization: 'Meta', }, ]; const transformArray = (org) => { const filteredByOrg = employees.filter((employee) => employee.organization === org); const addedFullName = filteredByOrg.map((employee) => ({ ...employee, fullName: employee.firstName + ' ' + employee.lastName, })); const uniqueByLastName = [...addedFullName.reduce((map, obj) => map.set(obj.lastName, obj), new Map()).values()]; return uniqueByLastName.sort((a, b) => a.id - b.id); }; transformArray(GOOGLE_ORG);Sí, puede usar Array.prototype.reduce para minimizar la creación de matrices y la cantidad de iteraciones.
const GOOGLE_ORG = 'Google'; const employees = [ { id: 3, firstName: 'John', lastName: 'Doe', organization: 'Google', }, { id: 7, firstName: 'Jake', lastName: 'Smith', organization: 'Google', }, { id: 1, firstName: 'Jane', lastName: 'Doe', organization: 'Google', }, { id: 2, firstName: 'Vanessa', lastName: 'Smith', organization: 'Meta', }, { id: 5, firstName: 'Sarah', lastName: 'Hernandez', organization: 'Meta', }, { id: 8, firstName: 'Jessica', lastName: 'Morales', organization: 'Google', }, { id: 4, firstName: 'Paul', lastName: 'Stark', organization: 'Google', }, { id: 6, firstName: 'Peter', lastName: 'Brown', organization: 'Meta', }, ]; const transformArray = (org) => { return (employees.reduce((lastNames => ((acc, curr) => { if(!lastNames.has(curr.lastName) && curr.organization === org) { lastNames.add(curr.lastName) acc.push({...curr, fullName: `${curr.firstName} ${curr.lastName}`}) } return acc; }))(new Set()), []).sort((a, b) => a.id - b.id)); }; console.log(transformArray(GOOGLE_ORG));Podrías encadenar todas las operaciones.
En realidad, devuelve un resultado diferente al filtrar apellidos únicos y ordenar después o al ordenar primero y luego filtrar.
Un ejemplo de cierre :
Tome esta línea para filtrar con un Set :
.filter((s => ({ lastName }) => !s.has(lastName) && s.add(lastName))(new Set))Un cierre toma las variables en el ámbito de la función de llamada y devuelve otra función. Esta función tiene acceso a la variable. Echemos un vistazo con un formato diferente:
.filter( (s => ({ lastName }) => !s.has(lastName) && s.add(lastName)) (new Set) ) Aquí, la función se llama con el new Set y esta función se devuelve
({ lastName }) => !s.has(lastName) && s.add(lastName)como devolución de llamada para el método de filtro.
const GOOGLE_ORG = 'Google', employees = [{ id: 3, firstName: 'John', lastName: 'Doe', organization: 'Google' }, { id: 7, firstName: 'Jake', lastName: 'Smith', organization: 'Google' }, { id: 1, firstName: 'Jane', lastName: 'Doe', organization: 'Google' }, { id: 2, firstName: 'Vanessa', lastName: 'Smith', organization: 'Meta' }, { id: 5, firstName: 'Sarah', lastName: 'Hernandez', organization: 'Meta' }, { id: 8, firstName: 'Jessica', lastName: 'Morales', organization: 'Google' }, { id: 4, firstName: 'Paul', lastName: 'Stark', organization: 'Google' }, { id: 6, firstName: 'Peter', lastName: 'Brown', organization: 'Meta' }], result = employees .filter(({ organization }) => organization === GOOGLE_ORG) .filter((s => ({ lastName }) => !s.has(lastName) && s.add(lastName))(new Set)) .sort((a, b) => a.id - b.id) .map(o => ({ ...o, fullName: o.firstName + o.lastName })); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }