为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复在 JSON 文件中创建新对象的问题?

如何修复在 JSON 文件中创建新对象的问题?

一只萌萌小番薯 2021-09-30 16:43:37
我正在尝试创建一个函数,当调用该函数时将更新 json 文件中的特定对象。但是,它会更新对象并创建一个新对象。我尝试了许多不同的方法来尝试让它发挥作用,但都失败了。我最接近它的工作是下面显示的代码,但它仍然没有完成所需的工作。这是我的功能:var fs = require('fs');var _ = require("underscore");module.exports = {  personalUpdate: function (id, forename, surname, dob, gender, callback) {        let rawdata = fs.readFileSync('data.json');    let data = JSON.parse(rawdata);    let filtered = _.where(data['students'], { id: id });    let all = filtered[0];    all.forename = forename;    all.surname = surname;    all.dob = dob;    all.gender = gender;    data["students"].push(all);    fs.writeFileSync('data.json', JSON.stringify(data, null, 2), (err) => {      if (err) throw err;    });    callback("success");  }}这是我要更新的 JSON 文件:{  "teachers": [    {      "name": "",      "email": "",      "password": "",      "formGroup": "",      "id": ""    }  ],  "students": [    {      "surname": "test",      "forename": "test",      "dob": "",      "homeAddress": "",      "homePhone": "",      "gender": "",      "tutorGroup": "",      "schoolEmail": "",      "grades": [        {          "french": 8,          "maths": 7        }      ],      "id": ""    },    {      "surname": "test2",      "forename": "test2",      "dob": "",      "homeAddress": "test2",      "homePhone": "",      "gender": "",      "tutorGroup": "",      "schoolEmail": "",      "grades": [        {          "french": 9,          "maths": 8        }      ],      "id": ""    }  ]}我不得不删除和更改其中的对象和信息,因为它包含机密信息。运行此函数时,它会查找参数中指定的对象。然后它更新该对象,但它随后在原始 JSON 对象的底部创建另一个对象,这是不应该的。另外,有没有更好的方法来更新 JSON 文件中的特定对象?
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

  1. 结果集重复,因为您将其推入数组

  2. 由于变量持有相同的对象引用,因此正在应用更改,因此它们在共享相同指针的对象之间被镜像。

解释

由于data["students"].push(all);指令,它创建了一个新的。

当您在 javascript 中操作对象时,您需要了解它们之间的引用是如何工作的,这样您就可以避免错误并从中受益。

例如,以这组指令为例:

let a = {"x": 1};

let b = a;

b.x = 3;

console.log(a) // it will output {"x": 3}

请注意,我们:

  1. 创建一个 propx相等的对象并将其1分配给变量a

  2. b用值初始化一个变量a

  3. 更改x变量/对象的属性b

  4. 然后我们可以观察到a,由于对象引用,变化也反映在变量中。

所以,基本上这正是你的指令在你all.forename = forename;改变变量时发生的事情all,但也改变了它派生的原始对象。

这是一个很好的参考,更深入地解释了这个概念

@编辑

我强烈建议您不要使用sync类似的函数版本,readFileSync因为这会阻止事件循环。这是关于它的官方指南


查看完整回答
反对 回复 2021-09-30
  • 1 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信