如何用字典翻译对象?为何迭代后仅保留最后一项结果?
问题描述
我有一个包含通用名称的selections数组:
selections = [ {division: 'division1', branch: 'branch1'}, {division: 'division2', branch: 'branch2'}, {division: 'division3', branch: 'branch3', department: 'department1'}, {division: 'division4', branch: 'branch4'} ]
(注:原代码的数组写法不符合JS语法,已修正为标准数组格式)
同时有对应的翻译字典:
translation = { division: { division1: "Some Division", division2: "Some Other Division", division3: "Another Division", division4: "One More" }, branch: { branch1: "Br1", branch2: "Br2", branch3: "Br3", branch4: "Br4" }, department: { department1: "Dep1", department2: "Dep2", department3: "Dep3", department4: "Dep4" } }
我尝试通过迭代每个selection并赋值来完成翻译:
let translatedSelections = {}; // 初始化主对象 for (let selection of selections) { let translatedSelection = {}; // 每次迭代创建空对象 for (const [key, value] of Object.entries(selection)) { translatedSelection[key] = translation[key][value]; // 赋值翻译内容 } translatedSelections = Object.assign(translatedSelections, translatedSelection); // 合并到主对象 }
但最终结果只保留了最后一个selection的翻译,之前的内容都被覆盖了,主对象里只有单个对象。想知道为什么会出现覆盖,而不是把每个翻译结果都加进去?
原因分析
问题出在两个核心点:
- 目标容器类型错误:你初始化的
translatedSelections是一个空对象{},但原selections是数组,需要存储多个翻译后的对象,应该用数组而非单个对象。 Object.assign的行为特性:Object.assign(target, source)的作用是把source对象的属性合并到target对象中。由于每个translatedSelection都包含division、branch这些重复键,每次合并都会覆盖掉之前对象里的同名键值对,循环结束后自然只剩最后一次的内容。
解决方法
把translatedSelections改成数组,每次循环将翻译后的对象推入数组即可:
let translatedSelections = []; // 改为数组类型 for (let selection of selections) { let translatedSelection = {}; for (const [key, value] of Object.entries(selection)) { translatedSelection[key] = translation[key][value]; } translatedSelections.push(translatedSelection); // 将翻译对象推入数组 }
也可以用更简洁的数组map方法实现:
const translatedSelections = selections.map(selection => { const translated = {}; for (const [key, val] of Object.entries(selection)) { translated[key] = translation[key][val]; } return translated; });
这样最终translatedSelections会是一个包含4个翻译后对象的数组,和原selections的结构完全对应,不会再出现覆盖问题。
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

