如何通过ES6嵌套对象解构移除嵌套对象中的isCorrect属性
您好,我想要从嵌套对象中移除指定属性isCorrect,具体情况如下:
原始数据列表
{ id: 1, questionText: 'This is a test question for tests', answerOptions: [ { answerText: 'A', isCorrect: true }, { answerText: 'B', isCorrect: false } ], difficulty: 1 }, { id: 2, questionText: 'This is another test question for tests', answerOptions: [ { answerText: 'A', isCorrect: false }, { answerText: 'B', isCorrect: true } ], difficulty: 2 }
期望得到的结果
{ id: 1, questionText: 'This is a test question for tests', answerOptions: [ { answerText: 'A' }, { answerText: 'B' } ], difficulty: 1 }, { id: 2, questionText: 'This is another test question for tests', answerOptions: [ { answerText: 'A' }, { answerText: 'B' } ], difficulty: 2 }
我目前通过如下delete方法实现了需求,但该方案并非最优解:
const cleanResponses = (questions: Question[]): Question[] => { questions.forEach(question => { question.answerOptions.forEach((answer) => { delete answer.isCorrect }); }) return questions; }
我尝试使用下面这行嵌套解构的写法实现需求,但没有成功:
const { answerOptions: [{ isCorrect }], ...rest } = question
请问正确的实现方式是什么?谢谢。
解决方案
你之前的解构写法仅能提取answerOptions数组第一个元素的isCorrect属性,无法批量处理数组内所有答案对象,因此无法达到预期效果。
推荐使用无副作用的不可变方案实现,不会修改原始输入数据,避免可变操作带来的潜在数据污染问题,也是社区普遍认可的最优实现:
const cleanResponses = (questions: Question[]): Question[] => { return questions.map(question => { // 遍历处理所有答案,移除isCorrect属性 const cleanedAnswers = question.answerOptions.map(({ isCorrect, ...restAnswer }) => restAnswer) // 返回新的问题对象,不修改原对象 return { ...question, answerOptions: cleanedAnswers } }) }
如果业务场景确实需要修改原对象,可在原有delete方案基础上补充属性存在性判断避免报错,但优先推荐上述不可变方案,更适配React、Vue等框架的状态更新逻辑。
内容的提问来源于stack exchange,提问作者Alexandre Bonfim
相关产品推荐
相关产品推荐

