使用For Loop写入JSON文件仅输出数组最后一项的问题
问题原因
你遇到的问题核心是循环外创建的data对象被重复引用。每次循环你只是修改这个对象的items和key属性,然后把同一个对象的引用推入myrecords数组。循环结束后,数组里所有元素都指向最后一次修改后的data对象,所以最终输出全是最后一项的数据。
修复方案
把data对象的创建逻辑移到循环内部,每次循环都生成一个新的独立对象:
let rawdata = fs.readFileSync('./input_data.json'); let jsondata = JSON.parse(rawdata); let myrecords = []; for(let i = 0; i < jsondata.records.length; i++) { let obj = jsondata.records[i]; // 每次循环新建一个data对象 let data = { items: [obj.data], key: obj.Id }; myrecords.push(data); } var log_file = fs.createWriteStream(__dirname + '/output.json', {flags : 'w'}); var log_stdout = process.stdout; console.log = function(d) { log_file.write(util.format(d) + '\n'); log_stdout.write(util.format(d) + '\n'); }; console.log(JSON.stringify(myrecords, null, 2))
额外优化建议
- 可以用
forEach循环简化代码,可读性更强:
jsondata.records.forEach(obj => { myrecords.push({ items: [obj.data], key: obj.Id }); });
- 注意变量声明:原代码里
myrecords没有用let/const声明,会变成全局变量,建议加上const(如果不需要修改数组引用)或let。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

