猿问

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

我正在尝试创建一个函数,当调用该函数时将更新 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 文件中的特定对象?


一只萌萌小番薯
浏览 213回答 1
1回答

qq_花开花谢_0

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

相关分类

JavaScript
我要回答