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

如何在JavaScript对象中遵循DRY原则避免键值重复?

优化违反DRY原则的JavaScript对象定义

你这段代码里,对象键(如_7B2CDA)与内部number属性值完全重复,确实违反了DRY原则。下面提供几种方案,既能避免重复编写编号,又能保留通过编号查找对象的能力:

方案1:基于数组动态生成目标对象(推荐)

先把任务的核心数据(编号、类型)存到数组里,只写一次编号,再通过reduce方法动态生成带下划线前缀的键的对象:

// 核心任务数据,仅需编写一次编号和类型
const taskData = [
  { number: "7B2CDA", type: TASKS_TYPES.written_1 },
  { number: "DGA445", type: TASKS_TYPES.written_2 }
];

// 动态生成目标对象
const LISTENING_TASKS = taskData.reduce((acc, task) => {
  acc[`_${task.number}`] = task;
  return acc;
}, {});

后续新增任务时,只需在taskData中添加一条数据即可,无需重复编写编号。查找对象仍可使用LISTENING_TASKS._7B2CDA。

方案2:直接用编号作为对象键(简化版)

如果可以接受去掉键名的下划线前缀,直接用编号作为键,代码会更简洁:

const LISTENING_TASKS = taskData.reduce((acc, task) => {
  acc[task.number] = task;
  return acc;
}, {});

// 查找方式:LISTENING_TASKS["7B2CDA"](注意数字开头的键不能用点语法)

方案3:用工具函数+计算属性名(适用于少量任务)

如果不想用数组动态生成,也可以通过工具函数和计算属性名减少重复:

// 封装生成任务对象的工具函数
const createTask = (number, type) => ({ number, type });

const LISTENING_TASKS = {
  [`_${"7B2CDA"}`]: createTask("7B2CDA", TASKS_TYPES.written_1),
  [`_${"DGA445"}`]: createTask("DGA445", TASKS_TYPES.written_2)
};

以上方案都能保证编号仅编写一次,同时保留通过编号查找、复用对象的能力,完全符合DRY原则。

内容的提问来源于stack exchange,提问作者Kifsif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:54:30