Dada la siguiente estructura:
const data = { "show": "Family Guy", "characters": [ [{name: 'Peter', age: 40, city: 'Quahog'}], [{name: 'Louis', age: 30}], [{name: 'Chris', age: 16}], [{name: 'Stewie', age: 1}] ] } ¿Cómo podemos agregar a cada carácter el par clave/valor de city: 'Quahog' para que el resultado sea el siguiente?
const item = { "show": "Family Guy", "characters": [ [{name: 'Peter', age: 40, city: 'Quahog'}], [{name: 'Louis', age: 30, city: 'Quahog'}], // city added [{name: 'Chris', age: 16, city: 'Quahog'}], // city added [{name: 'Stewie', age: 1, city: 'Quahog'}] // city added ] }Intentamos usar:
let city = data.characters.[0][0].city; costs = _.map(items, (itemArray) => { items = _.map(itemArray, (item) => { if(!item.city) { item.city = city; } });Pero no funciona según lo previsto y no podemos obtener el resultado deseado. ¿Alguna idea de cómo lograr esto?
No estoy seguro del motivo de tener estas matrices de un solo elemento, pero esta solución funcionará (le recomendaré que eche un vistazo al proceso que crea este formato de datos, que es un poco extraño)
const data = { "show": "Family Guy", "characters": [ [{name: 'Peter', age: 40, city: 'Quahog'}], [{name: 'Louis', age: 30}], [{name: 'Chris', age: 16}], [{name: 'Stewie', age: 1}] ] } const city = data.characters.find(characters => characters.find(character => character.city))[0].city const dataWithCities = { ...data, characters: data.characters.map(characters => characters.map(character => character.city ? character : {...character, city})) } console.log(dataWithCities)Aquí hay otra forma de hacerlo con .reduce() :
const data = { "show": "Family Guy", "characters": [ [{name: 'Peter', age: 40, city: 'Quahog'}], [{name: 'Louis', age: 30}], [{name: 'Chris', age: 16}], [{name: 'Stewie', age: 1}] ] }; data.characters.reduce((a,c)=> (c[0].city=a[0].city,a)); console.log(data); Al usar .reduce() sin un segundo argumento, tomará el primer elemento de la matriz como el valor inicial que luego se usa como plantilla para copiar la propiedad .city a todos los demás elementos. El valor de retorno real del método .reduce() se descarta, pero la propia matriz de entrada ( data ) se modifica en el proceso y luego se muestra en la expresión console.log() .
prueba este
let city = data.characters.[0][0].city; let newdata = []; data.characters.map(items, (itemArray) => { items = _.map(itemArray, (item) => { if(item.city === undefined) { newdata.push({...item , city}); } else { newdata.push({...item}); } }) costs = {...newdata}