JavaScript中数据量未知时,如何基于给定JSON数组生成目标键值对对象
现有代码的核心问题
你的实现存在两个关键错误,导致无法得到预期结果:
- 在循环内触发响应发送:Node.js服务端的HTTP响应仅能发送一次,你在map的每次遍历中都调用
res.status(200).json(),会在处理第一个条目时就把响应发回客户端、终止当前请求的流程,后续的遍历逻辑根本不会执行,最终返回的也只是单条内容的零散对象,不是聚合后的完整结构。 - 动态对象键写法错误:JavaScript的对象字面量中,如果直接写
{markName: markValue},生成的对象键是固定的字符串"markName",并不会读取markName变量存储的实际字段名(比如nama_penduduk)。要使用动态变量作为键名,必须用方括号语法包裹变量。
正确实现方式
全程不需要提前预知数组的总条数,核心思路是先把所有条目聚合到同一个目标对象中,全部处理完成后再统一发送一次响应:
- 从原始返回数据中取出存储条目的
data数组 - 逐一遍历数组中的每个条目,把
markname作为对象键、markvalue作为对应键的属性值,写入初始为空的目标对象 - 所有条目遍历完成后,再调用响应方法返回最终的对象
推荐使用数组reduce的聚合写法:
// 取出条目列表数组 const entryList = dataResult.data; // 自动遍历所有条目聚合为目标对象,初始值为空对象 const newJSON = entryList.reduce((accumulator, currentEntry) => { // 方括号语法实现动态键名绑定 accumulator[currentEntry.markname] = currentEntry.markvalue; return accumulator; }, {}); // 全部处理完成后,统一返回一次响应 res.status(200).json(newJSON);
如果偏好可读性更高的forEach写法,逻辑完全等价:
const newJSON = {}; // 无论数组有多少条目,forEach都会自动遍历完全部元素 dataResult.data.forEach(entry => { newJSON[entry.markname] = entry.markvalue; }); res.status(200).json(newJSON);
上述两种写法都不依赖硬编码的条目数,不管data数组有3条还是300条,都能正确生成预期结构的对象。
内容的提问来源于stack exchange,提问作者Muhammad Rafi Bahrur Rizki
相关产品推荐
相关产品推荐

