Node.js遍历JSON文件仅返回最后一个ID多次问题求助
解决大JSON文件遍历只返回最后一个ID的问题
嘿,别担心,新手遇到这种问题太正常了!我帮你分析下代码里的问题,再给你修正方案:
核心问题出在这两处
- 循环逻辑错误:你用
for(i in pojo)遍历,但每次打印的是pojo.id——这是在访问整个pojo对象的id属性,而不是当前遍历到的条目ID。而且i没有用let/const声明,变成了全局变量,这会导致循环结束后i保留最后一个索引值,进而出现重复打印最后一个ID的情况。 for...in的不当使用:for...in是用来遍历对象属性的,如果你要遍历数组(30万条目大概率是数组结构),用它会带来很多坑,比如会遍历到数组原型链上的额外属性,遍历顺序也不稳定。
修正后的代码示例
根据你的JSON结构,分两种情况给你调整:
情况1:JSON是一个数组(最常见的场景)
如果你的JSON文件内容是类似[{id: "123"}, {id: "456"}, ...]的数组,用数组的forEach方法遍历最稳妥:
const fs = require('fs'); const json = require('big-json'); const readStream = fs.createReadStream('read-data.json'); const parseStream = json.createParseStream(); parseStream.on('data', function(pojo) { // pojo就是解析后的完整数组,遍历每个条目 pojo.forEach(item => { console.log(item.id); // 这里替换成你的后续处理逻辑 }); }); readStream.pipe(parseStream);
情况2:JSON是一个键值对对象
如果你的JSON是类似{"item1": {id: "123"}, "item2": {id: "456"}, ...}的结构,用Object.values()提取所有值再遍历:
const fs = require('fs'); const json = require('big-json'); const readStream = fs.createReadStream('read-data.json'); const parseStream = json.createParseStream(); parseStream.on('data', function(pojo) { // 提取对象的所有值(也就是每个条目) for (const item of Object.values(pojo)) { console.log(item.id); // 后续处理逻辑 } }); readStream.pipe(parseStream);
额外注意事项
- 处理30万+条数据时,如果后续是异步操作(比如写入数据库、调用API),记得控制并发数,不然容易把内存占满或者触发服务限流。
- 始终用
let/const声明变量,避免全局变量污染导致的奇怪bug。
内容的提问来源于stack exchange,提问作者Thomas Petersen
相关产品推荐
相关产品推荐

