如何遍历Object的嵌套子对象并按条件为每个子对象插入键值对
实现方案
以下提供两种实现方式,可根据业务场景选择:
推荐不可变实现(不修改原始数据)
该方案会返回全新的处理后对象,不会改动原有的answers数据,适合需要保留原始数据的场景。
function processAnswers(answers) { // 字符串答案对应分数映射表 const scoreMap = { Poor: 1, Good: 5, Excellent: 10 } return Object.fromEntries( Object.entries(answers).map(([questionKey, questionItem]) => { let score = 0 // 异常场景默认值可自行调整 const answer = questionItem.answer if (typeof answer === 'string') { score = scoreMap[answer] ?? 0 } else if (typeof answer === 'object' && answer !== null) { score = Number(answer.duration) ?? 0 } // 拼接新对象返回,不修改原数据 return [questionKey, { ...questionItem, score }] }) ) } // 调用示例 const newAnswers = processAnswers(answers)
原地修改实现(直接改动原始对象)
该方案直接在原对象上新增score字段,内存占用更低,适合数据量较大且不需要保留原始数据的场景。
function processAnswersInPlace(answers) { const scoreMap = { Poor: 1, Good: 5, Excellent: 10 } for (const questionKey in answers) { const item = answers[questionKey] if (typeof item.answer === 'string') { item.score = scoreMap[item.answer] ?? 0 } else if (typeof item.answer === 'object' && item.answer !== null) { item.score = Number(item.answer.duration) ?? 0 } } return answers }
- 两种实现都自动适配顶层对象任意数量的子对象,不需要提前指定键名
- 代码中加入了异常兜底逻辑,未匹配到的字符串答案、duration不存在/非数字的场景默认返回0,可根据实际需求调整默认值
内容的提问来源于stack exchange,提问作者farhan hasan
相关产品推荐
相关产品推荐

