Me gustaría insertar los nombres en un nuevo objeto si tienen la misma identificación. La solución aún no está ahí, pero me estoy acercando.
const names = [ {id:1,name:"jame"}, {id:2,name:"jill"}, {id:3,name:"hanna"}, {id:3,name:"clark"} ] const newNames = [] // Something like this names.foreach((person,index) => { if(newNames[index].id === person.id){ newNames.push({id:person.index, names:[...newNames.name,person.name]}) }else{ newNames.push({id:person.index, person.name}) } })El resultado sería algo como esto:
const newNames = [ {id:1,name:"jame"}, {id:2,name:"jill"}, {id:3,names: {name:"clark",name:"hanna"}} ]Problema: no se pueden leer las propiedades de undefined (leyendo 'id')
Una forma de hacerlo:
const names = [ {id:1,name:"jame"}, {id:2,name:"jill"}, {id:3,name:"hanna"}, {id:3,name:"clark"} ]; let output = [] let ids = [...new Set(names.map(i=>i.id))]; ids.forEach((id) => { let res = names.filter((name) => name.id == id) output.push({id, name: res.length > 1 ? res.map(i => i.name) : res[0].name}) }) console.log(output) Tenga en cuenta que he proporcionado una matriz para el atributo de name para que las entradas con varios nombres sean menos repetitivas.
Acompañando tu solución:
names.forEach((person,index) => { let existingIndex = newNames.findIndex( (entry) => entry.id === person.id) if(existingIndex >= 0){ if(newNames[existingIndex].hasOwnProperty('name')) newNames[existingIndex] = ({id: person.id, names: [newNames[existingIndex].name,person.name]}) else newNames[existingIndex] = ({id: person.id, names: [...newNames[existingIndex].names,person.name]}) } else { newNames.push({id:person.id, name: person.name}) } }) La parte newNames[index].id en su solución original da como resultado un error porque newNames no tiene ningún elemento hasta el momento. Entonces, básicamente, newNames[0] da como resultado undefined .