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

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);

代码逻辑说明

  1. 遍历forms数组:使用map返回新对象,通过扩展运算符...item保留原数据的所有字段,仅重新处理answer字段。
  2. 遍历answer数组:同样用map返回新对象,保留原data的其他字段(username、date等),替换answers为修正后的对象。
  3. 处理answers键名:用Object.entries获取answers的键值对数组,再通过reduce累加生成新对象,将每个键转换为「无空格、小写带下划线」的格式。
  4. 避免修改原数据:全程返回新对象,不会改动MongoDB返回的原始数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:05:19