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

如何在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));
});

解决方案

错误原因

  1. fs.appendFile是直接将内容追加到文件末尾,不会合并JSON结构,导致原有JSON格式被破坏。
  2. 代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:05:14