Tengo este tipo de diccionario: INPUT
movies = { 'big' : { actors : ['Elizabeth Perkins', 'Robert Loggia'] }, 'forrest gump' : { actors : ['Tom Hanks', 'Robin Wright', 'Gary Sinise'] }, 'cast away' : { actors : ['Helen Hunt', 'Paul Sanchez'] } };y quiero usar este diccionario para obtener uno diferente. Por ejemplo, tengo que hacer una función llamada "películas con actores" que recibirá dos argumentos: "películas" y "actor". El actor podría ser "Tom Hanks", por lo que cuando descubre que estuvo en la película, no lo agrega a la matriz anidada, pero si no lo estaba, lo agrega.
PRODUCCIÓN
movies = { 'big' : { actors : ['Elizabeth Perkins', 'Robert Loggia', 'Tom Hanks'] }, 'forrest gump' : { actors : ['Tom Hanks', 'Robin Wright', 'Gary Sinise'] }, 'cast away' : { actors : ['Helen Hunt', 'Paul Sanchez', 'Tom Hanks] } };Hago esto:
for (const value of Object.values(newMovies)){ console.log(value.actors) for (const act of value.actors){ //console.log(act) if (act == actor) { console.log("Ok, not add") }else{ console.log("Here I have to add"); } } } donde "newMovies" es una copia de "movies" y "actor = "Tom Hanks" pero no puedo agregar a la matriz en actores: [ ... ]. ¿Alguna sugerencia? ¿Puedo usar map() ?
Según el requisito, lo que entendí es que existe una variedad de objetos de películas y desea asignar un hero en esas películas. Tenemos que ignorar si el nombre del héroe pasado ya está allí para esa película; de lo contrario, agregue ese héroe debajo de esa película. Si mi entendimiento es correcto, aquí tienes :
const movies = { 'big' : { actors : ['Elizabeth Perkins', 'Robert Loggia'] }, 'forrest gump' : { actors : ['Tom Hanks', 'Robin Wright', 'Gary Sinise'] }, 'cast away' : { actors : ['Helen Hunt', 'Paul Sanchez'] } }; function updateMoviesList(obj, heroName) { Object.keys(obj).forEach(key => { if (!obj[key].actors.includes(heroName)) { obj[key].actors.push(heroName) } }) return obj; } console.log(updateMoviesList(movies, 'Tom Hanks'));Me gusta esto de docs
let sports = ['soccer', 'baseball'] let total = sports.push('football', 'swimming') console.log(sports) // ['soccer', 'baseball', 'football', 'swimming'] console.log(total.length) // 4Para acceder a la matriz dentro del diccionario, primero debe acceder a ella
movies['big']['actors'].push('New Actor') let actor = 'Tom Hanks' for (const value of Object.values(newMovies)){ for (const act of value.actors){ if (value.actors.includes(actor)) { //Here you check if actor contains in array console.log("Ok, not add") }else{ console.log("Here I have to add"); value.actors.push(actor) //if not push to array } } }I was suggested to use map instead and the class Object... function actorInMovies(movies, actor) { let mappedObject = { ...movies}; Object.entries(movies).map(movie => { const movieName = movie[0]; const actors = movie[1].actors; if (!actors.includes(actor)) actors.push(actor); mappedObject = { ...mappedObject, [movieName]: { actors } }; }); return mappedObject } function main(){ const movies = { 'big' : { actors : ['Elizabeth Perkins', 'Robert Loggia'] }, 'forrest gump' : { actors : ['Tom Hanks', 'Robin Wright', 'Gary Sinise'] }, 'cast away' : { actors : ['Helen Hunt', 'Paul Sanchez'] } }; const actor = 'Tom Hanks'; console.log(actorInMovies(movies, actor)) } main();