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

Node.js遍历JSON文件仅返回最后一个ID多次问题求助

解决大JSON文件遍历只返回最后一个ID的问题

嘿,别担心,新手遇到这种问题太正常了!我帮你分析下代码里的问题,再给你修正方案:

核心问题出在这两处

  1. 循环逻辑错误:你用for(i in pojo)遍历,但每次打印的是pojo.id——这是在访问整个pojo对象的id属性,而不是当前遍历到的条目ID。而且i没有用let/const声明,变成了全局变量,这会导致循环结束后i保留最后一个索引值,进而出现重复打印最后一个ID的情况。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:25:00