如何在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
相关产品推荐
相关产品推荐

