You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用字典翻译对象?为何迭代后仅保留最后一项结果?

问题描述

我有一个包含通用名称的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的翻译,之前的内容都被覆盖了,主对象里只有单个对象。想知道为什么会出现覆盖,而不是把每个翻译结果都加进去?

原因分析

问题出在两个核心点:

  1. 目标容器类型错误:你初始化的translatedSelections是一个空对象{},但原selections是数组,需要存储多个翻译后的对象,应该用数组而非单个对象。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:37:46