繁体   English   中英

如何在不使用 node.js 覆盖现有 json 数据的情况下使用对象数组的键推送数据?

[英]how to push a data with key of an array of objects without overwriting existing json data using node js?

我有一个 object,看起来像这样:

{
  "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,
      
    }
  ]
}

如果添加新用户,我得到的是 OUTPUT,它不会附加,但会被覆盖或创建为新用户 OBJECT

{
     "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,
              
            }
          ]

预期的

如果新的人员数据到达我的 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,
              
            }
          ],
"Josh": [ 
            {
                "id":1,
              "name": "Josh",
              "age":26
             
            },
            {
                "id":2,
              "name": "Josh",
              "age": 24,
              
            }
          ]
        }

我在阅读 JSON 文件后尝试了这种方法

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));
});

就像已经给出的建议一样,但是使用async fs i/o。

import { promises as fs } from 'fs';  // or require('fs').promises

// inside the OP's route
  const filename = 'users.json';
  try {
    const array = await fs.readFile(filename);

    // OP's code here
    // const newObject = array.reduce(...

    await fs.writeFile(filename, newObject);
    return res.send(JSON.stringify(newObject));

  } catch (error) {
    return res.status(500).send({ message: 'error' });
  }

另请注意,所有这些都是数据库所做的。

你必须先从 JSON 和 append 读取新的 object 到 JSON 的数据,然后将其写回文件。

const data = fs.readFileSync('users.json');
.
.
fs.writeFileSync('users.json', {...data, ...newObject});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM