如何在Node.js中向对象数组键推送数据且不覆盖原有JSON数据
问题:JSON数据追加失败,出现覆盖或格式错误
现有JSON结构
{"mark": [{"id":1,"name": "mark","age":26},{"id":2,"name": "mark","age":25}],"jack": [{"id":1,"name": "jack","age":26},{"id":2,"name": "jack","age": 24}]}
错误输出(新增用户时)
{"mark": [{"id":1,"name": "mark","age":26},{"id":2,"name": "mark","age":25}],"jack": [{"id":1,"name": "jack","age":26},{"id":2,"name": "jack","age": 24}],} "Josh": [{"id":1,"name": "Josh","age":26},{"id":2,"name": "Josh","age": 24}]
预期效果
{"mark": [{"id":1,"name": "mark","age":26},{"id":2,"name": "mark","age":25}],"jack": [{"id":1,"name": "jack","age":26},{"id":2,"name": "jack","age": 24}],"Josh": [{"id":1,"name": "Josh","age":26},{"id":2,"name": "Josh","age": 24}]}
当前尝试的代码
var newObject = array.reduce(function (obj, value) { var key = `${value.name}`; if (obj[key] == null) obj[key] = []; obj[key].push(value); return obj; }, {}); console.log(newObject); fs.appendFile("users.json", newObject, (err) => { res.send(JSON.stringify(newObject)); });
解决方案
错误原因
fs.appendFile是直接将内容追加到文件末尾,不会合并JSON结构,导致原有JSON格式被破坏。- 代码中
reduce的初始值是空对象{},完全重新构建新对象,没有合并原有文件中的数据,相当于覆盖原有内容。
修正代码
const fs = require('fs'); // 假设array是待新增的用户数据数组 const array = [{"id":1,"name": "Josh","age":26},{"id":2,"name": "Josh","age": 24}]; // 读取原有JSON文件并合并数据 fs.readFile('users.json', 'utf8', (err, data) => { // 处理文件不存在或读取错误的情况,初始化空对象 const existingData = err ? {} : JSON.parse(data); // 在原有数据基础上合并新数据 const updatedData = array.reduce((obj, value) => { const key = `${value.name}`; // 若键不存在则初始化空数组,否则复用已有数组 obj[key] = obj[key] || []; obj[key].push(value); return obj; }, existingData); // 传入原有对象作为reduce的初始值 // 将完整的合并后数据写入文件(覆盖整个文件,保证JSON格式正确) fs.writeFile('users.json', JSON.stringify(updatedData), (writeErr) => { if (writeErr) throw writeErr; res.send(JSON.stringify(updatedData)); }); });
关键说明
- 读取原有数据:用
fs.readFile读取文件内容并解析为JS对象,确保不会丢失原有数据。 - 合并数据:
reduce的初始值设置为原有数据对象,实现在已有结构上追加新内容,而非重新构建。 - 写入完整数据:使用
fs.writeFile替换整个文件,保证JSON结构的完整性,避免appendFile导致的格式混乱。 - 可选优化:
JSON.stringify(updatedData, null, 2)可以格式化输出JSON,方便后续查看和维护。
内容的提问来源于stack exchange,提问作者maranR
相关产品推荐
相关产品推荐

