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"} ];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).
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("-")}` })) )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.