Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

147
Vistas
Agrupar una matriz de objetos y asignar un nuevo valor combinado a cada objeto

De una matriz de objetos, me gustaría agregar un atributo de alumni para cada objeto. El valor de este atributo es una concatenación separada por "-" de los nombres de todos los objetos que tienen el mismo valor school .

Ahora, la parte complicada es que necesito hacer que el rendimiento sea lo más eficiente posible, ya que la matriz de objetos inicial es muy grande.

Encontré una solución usando groupBy school, en cada grupo asigne los diferentes nombres y los concatene en una cadena, luego haga un bucle en cada objeto para agregar el nuevo atributo y valor, y finalmente haga un bucle en cada grupo para colocar todos los objetos en un nueva matriz (deshacer los grupos).

Estoy seguro de que hay una manera mucho más limpia de hacer esto. Cualquier sugerencia es más que bienvenida.

A continuación se muestra la matriz inicial y el resultado esperado con el nuevo atributo agregado a cada objeto de la matriz.

 var initialArr = [ {name:"A", school:"LFM"}, {name:"B", school:"LFM"}, {name:"C", school:"PBE"}, {name:"D", school:"LFM"}, {name:"E", school:"BPE"}, {name:"F", school:"LFM"} ]; var expectedResult = [ {name:"A", school:"LFM", alumni:"ABDF"}, {name:"B", school:"LFM", alumni:"ABDF"}, {name:"C", school:"PBE", alumni:"CE"}, {name:"D", school:"LFM", alumni:"ABDF"}, {name:"E", school:"BPE", alumni:"CE"}, {name:"F", school:"LFM", alumni:"ABDF"} ];
about 4 years ago · Santiago Gelvez
3 Respuestas
Responde la pregunta

0

Yo diría que la forma más eficiente de hacerlo sería crear un objeto que asigne la escuela a una serie de nombres. Luego map la matriz inicial:

 var initialArr= [ {name:"A", school:"LFM"}, {name:"B", school:"LFM"}, {name:"C", school:"PBE"}, {name:"D", school:"LFM"}, {name:"E", school:"BPE"}, {name:"F", school:"LFM"} ]; var schoolObj = initialArr.reduce((a, { name, school }) => { a[school] = (a[school] || []); a[school].push(name); return a; }, {}); var expectedResult = initialArr.map(e => { e.alumni = schoolObj[e.school].join("-"); return e; }); console.log(expectedResult);

Esta es la complejidad del tiempo O (n) pero también la complejidad del espacio O (n) (creo que todavía estoy aprendiendo en ese sentido). Podría hacer una solución O (n ^ 2) más ineficiente que tuviera un espacio constante, pero dado que mencionó que la matriz de entrada es muy grande, asumí que el tiempo sería su mayor restricción.

Tenga en cuenta que es posible que deba realizar una clasificación en la matriz de ex alumnos, en cuyo caso la complejidad del tiempo probablemente será O (n log n) si utiliza una clasificación eficiente (le dejo la elección del algoritmo).

about 4 years ago · Santiago Gelvez Denunciar

0

Filtra y mapea los datos a tu gusto.

 const initialArr= [ {name:"A", school:"LFM"}, {name:"B", school:"LFM"}, {name:"C", school:"PBE"}, {name:"D", school:"LFM"}, {name:"E", school:"BPE"}, {name:"F", school:"LFM"} ] console.log( initialArr.map(x => ({ name: x.name, school: x.school, alumni: `${x.name}-${initialArr.filter(y => x.school === y.school && y.name !== x.name).map(y => y.name).join("-")}` })) )

about 4 years ago · Santiago Gelvez Denunciar

0

La forma en que lo describe es eficiente.

Depende solo de cómo exactamente haga el groupBy y otras partes. Si no hay ciclo en ciclo (y no tiene que haberlo), la complejidad es O(n) (lineal), que es lo mejor que puede obtener. Puede haber espacio para alguna microoptimización pero eso es algo que no suele ser muy efectivo y en la mayoría de los proyectos no vale la pena el tiempo.

about 4 years ago · Santiago Gelvez Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda