Tengo una matriz de objetos que se ve así
{name:"name1", phoneNumbers:[{"home":"0700 999999"}, {"mobile":"0700 999998"}]}, {name:"name2", phoneNumbers:[{"home":"0700 999991"}, {"mobile":"0700 999995"}, fax:"48289299200"]}, {name:"name3", phoneNumbers:[{"home":"0700 999992"}, {"mobile":"0700 999988"}]} ]Lo que quiero lograr es algo como esto.
{name:"name1", phoneNumbers:[{"home":"0700 999999"}]}, {name:"name1", phoneNumbers:[{"mobile":"0700 999998"}]}, {name:"name2", phoneNumbers:[{"home":"0700 999991"}]}, {name:"name2", phoneNumbers:[{"mobile":"0700 999995"}]}, {name:"name2", phoneNumbers:[{fax:"48289299200"}]}, ... ]De esta manera, cada nombre aparecerá nuevamente con cada uno de los medios de contacto adjuntos.
Me acerqué de esta manera y me resultó difícil lograr que la solución funcionara, ya que el ciclo externo no espera a que el ciclo interno se ejecute de forma exhaustiva antes de poder continuar con el siguiente índice:
const doSomeRecursion=(arr, i, result)=>{ for(let j=0; j<arr[i]["phoneNumbers"].length; j++){ arr[i]["phoneNumbers"]=[arr[i]["phoneNumbers"][j]] result.push(arr[i]) } } const getAllContacts=(contacts)=>{ const reconstructedContacts=[] for(let i=0; i<contacts.length; i++){ doSomeRecursion(contacts, i, reconstructedContacts) } return reconstructedContacts }En primer lugar, este método debería darme el resultado deseado, pero no estoy seguro de por qué no. También creo que mi solución puede no ser la mejor manera de hacerlo y me encantaría saber cómo abordarían esto.
Editar: gracias, @TJ Crowder, corregí la pregunta y la envolví en una función.
El bloque de código inicial en su pregunta tiene múltiples errores de sintaxis, por lo que es difícil estar seguro de cuál es su estructura inicial, pero haciendo conjeturas razonables, no hay necesidad de recursividad aquí, solo bucles anidados:
const result = []; for (const {name, phoneNumbers} of original) { for (const number of phoneNumbers) { result.push({name, phoneNumbers: number}); } }Ejemplo en vivo:
const original = [ { name: "name1", phoneNumbers: [ { "home": "0700 999999" }, { "mobile": "0700 999998" } ] }, { name: "name2", phoneNumbers: [ { "home": "0700 999991" }, { "mobile": "0700 999995" }, {fax: "48289299200"} ] }, { name: "name3", phoneNumbers: [ { "home": "0700 999992" }, { "mobile": "0700 999988" } ] } ]; const result = []; for (const {name, phoneNumbers} of original) { for (const number of phoneNumbers) { result.push({name, phoneNumbers: number}); } } console.log(JSON.stringify(result, null, 4));También puede lograr esto usando una combinación de flatMap() y map()
const data = [ {name:"name1", phoneNumbers:[{"home":"0700 999999"}, {"mobile":"0700 999998"}]}, {name:"name2", phoneNumbers:[{"home":"0700 999991"}, {"mobile":"0700 999995"}, {"fax":"48289299200"}]}, {name:"name3", phoneNumbers:[{"home":"0700 999992"}, {"mobile":"0700 999988"}]} ]; const result = data.flatMap((n) => { return n.phoneNumbers.map((pn) => { return { name: n.name, phoneNumbers: [pn] } }); }); console.log(result);