JavaScript如何将3个平行数组转横向JSON响应(能否单次map实现)
实现方案
完全可以通过单次遍历完成格式转换,不需要多次循环。下面给出两种可直接落地的实现,同时兼容数组长度不一致的场景。
方案1:JS层单次map转换(符合你的预期写法)
先修正你原有代码的语法问题:JS变量声明关键字为小写var/const,req param缺少点运算符,字段名不建议带空格避免取值异常。
转换逻辑为:取三个数组的最大长度作为遍历基准,按下标一一对应组装对象,短数组缺失项自动补null,不会出现下标越界问题。
const investor_id = req.param("investor_id"); const condition = {"is_deleted": {"$ne": "1"}}; // 数据库查询 const rawList = await db.collection("dysinvestor").aggregate([ {"$match": condition}, {"$project": { _id: 0, file: "$formData.file1", nameOfFile: "$formData.origin_file1", file_type: "$formData.file1_filetype", }} ]).toArray(); // 单次map完成结构转换 const formatData = rawList.map(item => { const maxLength = Math.max(item.file.length, item.nameOfFile.length, item.file_type.length); return Array.from({length: maxLength}, (_, idx) => ({ file: item.file[idx] ?? null, nameOfFile: item.nameOfFile[idx] ?? null, file_type: item.file_type[idx]?.toLowerCase() ?? null })); }).flat(); // 组装最终响应 const res = { status: "ok", massage: "success", data: formatData };
如果能确定三个数组长度完全一致,可以直接用任意数组的长度作为遍历长度,省略maxLength计算逻辑。
方案2:数据库聚合阶段直接输出目标格式(无需JS层转换)
如果不想在业务层做结构处理,可以直接在MongoDB聚合管道中通过$zip+$map完成数组重组,数据库直接返回目标结构:
const investor_id = req.param("investor_id"); const condition = {"is_deleted": {"$ne": "1"}}; const formatData = await db.collection("dysinvestor").aggregate([ {"$match": condition}, {"$project": { fileItem: { $map: { input: { $zip: { inputs: ["$formData.file1", "$formData.origin_file1", "$formData.file1_filetype"], useLongestLength: true } }, as: "item", in: { file: { $arrayElemAt: ["$$item", 0] }, nameOfFile: { $arrayElemAt: ["$$item", 1] }, file_type: { $toLower: { $arrayElemAt: ["$$item", 2] } } } } } }}, {"$unwind": "$fileItem"}, {"$replaceRoot": {newRoot: "$fileItem"}} ]).toArray(); // 直接组装响应即可 const res = { status: "ok", massage: "success", data: formatData };
注意事项
- 你提供的原始JSON结构存在语法错误:
Investment字段对应的值是对象结构,不是数组,取值前先修正结构语法 - 两种方案都默认对
file_type做了小写转换,和你给出的期望输出格式一致 - 数组长度不一致时,缺失项会自动填充为
null,如果需要替换为其他默认值直接修改??后面的内容即可
内容的提问来源于stack exchange,提问作者Nia Rajput
相关产品推荐
相关产品推荐

