JS遍历字典时无法向嵌套actors数组追加元素如何解决
问题原因
你写的代码跑不通是两个核心问题导致的:
- 判断逻辑写岔了:你嵌套循环遍历每部电影的所有演员,只要某一个演员和传入的目标演员不相等,就判定要添加。举个例子,《阿甘正传》的演员列表里第一个是Tom Hanks,后面两个是Robin Wright、Gary Sinise,循环到后两个人的时候,因为不等于Tom Hanks,你的代码就会误触发"需要添加"的逻辑,判断完全不准。
- 只有日志没有实际操作:你全程只在控制台打印提示,根本没写把演员插入数组的实际代码,当然加不进去。
实现方案
方案1:顺着你原本的循环思路改(最简单直观)
根本不需要挨个遍历演员数组做对比,直接用数组自带的includes()方法就能判断目标演员在不在列表里,不在的话调用push()加进去就行:
function moviesWithActors(movies, actor) { // 遍历所有电影条目 for (const movieInfo of Object.values(movies)) { // 演员列表里没找到目标演员才加 if (!movieInfo.actors.includes(actor)) { movieInfo.actors.push(actor) } } return movies }
注意:这个写法会直接修改你传入的原movies对象,如果不想动原数据,记得先做深拷贝再传进去。
方案2:用map()实现(不修改原数据,返回新对象)
map()是数组方法,没法直接遍历对象,你可以先把对象转成键值对数组,用map()处理完每一项之后再转回对象就行,这种写法不会改动原始输入:
function moviesWithActors(movies, actor) { // 转成 [电影名, 电影信息] 格式的数组后用map遍历处理 const handledList = Object.entries(movies).map(([title, info]) => { // 拷贝原有演员列表,避免改动原数组 const updatedActors = info.actors.includes(actor) ? [...info.actors] : [...info.actors, actor] return [title, { ...info, actors: updatedActors }] }) // 处理完转回对象结构 return Object.fromEntries(handledList) }
调用的时候直接传原字典和演员名就行:
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 res = moviesWithActors(movies, 'Tom Hanks') console.log(res)
跑出来的结果和你给的预期输出完全一致,顺带提一句你贴的预期输出里《cast away》条目的'Tom Hanks'末尾少打了一个单引号,属于书写笔误。
内容的提问来源于stack exchange,提问作者Ariel Marcelo Pardo
相关产品推荐
相关产品推荐

