JavaScript循环MongoDB数据构建对象仅返回单个键值对问题排查
问题:清理MongoDB返回数据中answers字段的键名格式
需要将MongoDB返回的forms数据里answers字段的键替换为无空格、小写带下划线的格式,但使用map循环处理时,console.log仅输出单个键值对,无法得到完整的answers对象。期望保留原数据结构,仅清理answers的键名。
原代码
const data_warehouse = forms.map((item) => { item.answer.map((data) => { let data_fix = {}; Object.keys(data.answers).map((key) => { return (data_fix = { [key.replace(/ /g, "_").toLowerCase()]: data.answers[key], }); }); console.log(data_fix); }); });
MongoDB原始数据
"forms": [ { "_id": "Quality", "title": "Quality", "answer": [ { "username": "Jansenstan24@gmail.coms", "date": "2022-10-25", "formId": "6357921d49de88bb7fffcfe4", "answers": { "Text": "john@dose.com", "Email": "john@nabatisnack.com", "Plant": "Cica" } }, { "username": "adam@wegodev.com", "date": "2022-10-25", "formId": "6357921d49de88bb7fffcfe4", "answers": { "Email": "john@dose.coms", "Plant": "Ranca", "Text Doang": "12" } }, { "username": "jansenstan24@gmail.com", "date": "2022-10-31", "formId": "6357921d49de88bb7fffcfe4", "answers": { "Text": "john@nabatisnack.com", "Email": "john@dose.com", "Plant": "Cica" } } ] } ]
当前输出
{ plant: 'Cica' } { text_doang: '12' } { plant: 'Cica' }
预期输出
[ { "_id": "Quality", "title": "Quality", "answer": [ { "username": "Jansenstan24@gmail.coms", "date": "2022-10-25", "formId": "6357921d49de88bb7fffcfe4", "answers": { "text": "john@dose.com", "email": "john@nabatisnack.com", "plant": "Cica" } }, { "username": "adam@wegodev.com", "date": "2022-10-25", "formId": "6357921d49de88bb7fffcfe4", "answers": { "email": "john@dose.coms", "plant": "Ranca", "text_doang": "12" } }, { "username": "jansenstan24@gmail.com", "date": "2022-10-31", "formId": "6357921d49de88bb7fffcfe4", "answers": { "text": "john@nabatisnack.com", "email": "john@dose.com", "plant": "Cica" } } ] } ]
解决方案
问题根源
原代码中处理Object.keys(data.answers)的map循环时,每次都将data_fix重新赋值为一个仅包含当前键值对的新对象,导致最终data_fix只保留了最后一个键值对,而非累加所有处理后的键值对。
修正后的代码
const data_warehouse = forms.map(item => { // 保留原item的其他字段,处理answer数组 return { ...item, answer: item.answer.map(data => { // 处理answers字段,生成格式修正后的新对象 const fixedAnswers = Object.entries(data.answers).reduce((acc, [key, value]) => { const newKey = key.replace(/ /g, "_").toLowerCase(); acc[newKey] = value; return acc; }, {}); // 保留data的其他字段,替换为修正后的answers return { ...data, answers: fixedAnswers }; }) }; }); // 打印处理后的完整数据结构 console.log(data_warehouse);
代码逻辑说明
- 遍历forms数组:使用
map返回新对象,通过扩展运算符...item保留原数据的所有字段,仅重新处理answer字段。 - 遍历answer数组:同样用
map返回新对象,保留原data的其他字段(username、date等),替换answers为修正后的对象。 - 处理answers键名:用
Object.entries获取answers的键值对数组,再通过reduce累加生成新对象,将每个键转换为「无空格、小写带下划线」的格式。 - 避免修改原数据:全程返回新对象,不会改动MongoDB返回的原始数据。
内容的提问来源于stack exchange,提问作者JS24
相关产品推荐
相关产品推荐

