我正在尝试创建一个函数,当调用该函数时将更新 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个赞
结果集重复,因为您将其推入数组
由于变量持有相同的对象引用,因此正在应用更改,因此它们在共享相同指针的对象之间被镜像。
解释
由于data["students"].push(all);
指令,它创建了一个新的。
当您在 javascript 中操作对象时,您需要了解它们之间的引用是如何工作的,这样您就可以避免错误并从中受益。
例如,以这组指令为例:
let a = {"x": 1};
let b = a;
b.x = 3;
console.log(a) // it will output {"x": 3}
请注意,我们:
创建一个 prop
x
相等的对象并将其1
分配给变量a
b
用值初始化一个变量a
更改
x
变量/对象的属性b
然后我们可以观察到
a
,由于对象引用,变化也反映在变量中。
所以,基本上这正是你的指令在你all.forename = forename;
改变变量时发生的事情all
,但也改变了它派生的原始对象。
这是一个很好的参考,更深入地解释了这个概念
@编辑
我强烈建议您不要使用sync
类似的函数版本,readFileSync
因为这会阻止事件循环。这是关于它的官方指南
添加回答
举报
0/150
提交
取消