Tengo una matriz que se ve así
people = [ {id:1, name:"Bob", lang:English}, {id:2, name:"Sally", lang:German,Hebrew}, {id:3, name:"Trish", lang:English}, ]Tengo un método para agregar a la matriz o para editar la matriz existente en función de la entrada. Este método tiene un nuevo idioma que se proporciona. Estoy agregando un psuedocode (no se me ocurrió nada mejor ya que soy muy nuevo en Typescript y Javascript).
onAddVariable() { //newLanguage is given to the input const people = people.map(person =>{ person.name === (new) //somehow to know if the name is a new name person.lang.push(newLanguage) return person } else{ people.push({id:4, name:newName, newLanguage}); return person } }Si se da una nueva persona, entonces la salida debería verse así.
people = [ {id:1, name:"Bob", lang:English}, {id:2, name:"Sally", lang:German,Hebrew}, {id:3, name:"Trish", lang:English}, {id:4, name:"Kash", lang:Urdu}, ]Si se le da un nuevo idioma a una persona existente, entonces la salida debería verse como
people = [ {id:1, name:"Bob", lang:English,Spanish}, {id:2, name:"Sally", lang:German}, {id:3, name:"Trish", lang:English}, {id:4, name:"Kash", lang:Urdu}, ]simplemente puede agregar verificación e intentar algo como esto en su función
let people = [ {id:1, name:"Bob", lang:["English"]}, {id:2, name:"Sally", lang:["German","Hebrew"]}, {id:3, name:"Trish", lang:["English"]}, ] let name1="Boby" let langnew="french" let newname=true; people.forEach((p)=>{ if(p.name===name1){ newname=false; if(!p.lang.includes(langnew)){ p.lang.push(langnew) } } }) if(newname===true){ let ar=[] ar.push(langnew); people.push({ id:people.length+1 ,name:name1,lang:ar}) } console.log("array",people)puedes intentar algo como esto
básicamente, addData devuelve una nueva matriz cada vez, por lo que si necesita actualizar la existente, debe sobrescribir la variable de people
la idea es que esté usando el nombre como el campo que verifica para actualizar o insertar el registro, por lo que primero crea un objeto con el nombre como clave usando reducir y allí se ocupa de sus operaciones de combinación
Luego, se deshace de las claves usando Object.values y ordena la matriz según las claves
let people = [ {id:1, name:"Bob", lang:['English']}, {id:2, name:"Sally", lang:['German','Hebrew']}, {id:3, name:"Trish", lang:['English']}, ] const addData = (data, name, lang) => Object.values(data.reduce((res, {id, name, lang}) => { return { ...res, [name]: { ...(res[name] || {}), id, name, lang: [...new Set([...lang, ...(res[name] || {lang: []}).lang])] } } }, {[name]: {id: data.length + 1, name, lang: [lang]}})).sort((a, b) => a.id - b.id) console.log(addData(people, 'Yuri', 'Italian')) console.log(addData(people, 'Bob', 'Italian'))