Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

146
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!