2016-08-02 3 views
0

Как заменить старый json-объект с помощью NodeJS новым обновленным объектом?Как заменить старый json-объект на новый с помощью NodeJS

Прямо сейчас, когда я обновляю json-файл, он сохраняет новые данные со старым.

JSON:

[ { 
    "id": 1, 
    "name": "Sven", 
    "phone": "123123" 
    }, 
    { 
    "id": 2, 
    "name": "Martin", 
    "phone": "2342342" 
    } ] 

Вот мой код:

var operation = POST.operation; // POST request comes with operation = update/insert/delete 


     if (operation == 'update') { 
      fs.readFile("file.json", "utf8", function (err, data) { 

       var jsonFileArr = []; 
       jsonFileArr = JSON.parse(data); //Parse the data from JSON file      
       var haveId = jsonFileArr.some(function (obj){ // Checks if the POST request have the same id as JSON file 
        return obj.id == POST.id; 
       }) 

       if (haveId) { // if true 

        var updateData = []; // Array with POST data 
        updateData.push({ 
         id: POST.id, 
         name: POST.name, 
         phone: POST.phone, 
        }) 
        jsonFileArr.push(updateData); 
        var newUsers = JSON.stringify(jsonFileArr); 
        fs.writeFile("file.json", newUsers, "utf8"); 
        console.log(err); 
       } 
      })     
     } 

я, вероятно, следует использовать delete object, но как я могу определить, что объект должен быть удален?

Поэтому, когда я обновляю данные с идентификатором 1, он удаляет старый идентификатор/имя/телефон и записывает новые данные.

ответ

2

Моя предпосылка на ваш вопрос заключается в том, что у вас есть несколько объектов в одном файле. Таким образом, простой способ обойти это было бы

 if (operation == 'update') { 
     fs.readFile("file.json", "utf8", function (err, data) { 

      var jsonFileArr = []; 
      jsonFileArr = JSON.parse(data); //Parse the data from JSON file 
      var haveId = jsonFileArr.some(function (obj){ // Checks if the POST request have the same id as JSON file 
       return obj.id == POST.id; 
      }) 

      if (haveId) { // if true 
       var updateData = []; // Array with POST data 
       updateData.push({ 
        id: POST.id, 
        name: POST.name, 
        phone: POST.phone, 
       }) 

       for(let Arr of jsonFileArr){ 
        if (Arr.id == POST.id){ 
        let currentIndex = jsonFileArr.indexOf(Arr); 
        jsonFileArr.splice(currentIndex,1,updateData) //removing the old object and adding the new one 
        } 
       } 

       var newUsers = JSON.stringify(jsonFileArr); 
       fs.writeFile("file.json", '', "utf8",function(err,res){ //Making the file empty 
        if(!err){ 
        fs.writeFile("file.json", newUsers, "utf8",function(err,res){ //Writing the whole object back 
         if(err)console.log(err); 
         console.info(res); 
        }); 
        }else{ 
        console.log(err); 
        } 
       }); 

      } 
     }) 
    } 

Я думаю, что это лучше, вместо того, чтобы использовать некоторые, получить индекс соответствия и замены напрямую.

 var jsonFileArr = JSON.parse(data); //Parse the data from JSON file 
     var foundId = jsonFileArr.findIndex(function (obj){ // Checks if the POST request have the same id as JSON file 
      return obj.id == POST.id; 
     }); 
     if (foundId >= 0) { 
     jsonFileArr[foundId] = 
      { 
       id: POST.id, 
       name: POST.name, 
       phone: POST.phone, 
      } 
     } 

...., а затем записать обратно в файл

+0

Wow спасибо, это работает! Но вы можете объяснить «Loop» для (var Arr jsonFileArr). (заменил let с var, потому что мой javascipt не поддерживает let) Я prety новый. – Bongskie

+1

[для ... of] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of) выполняет итерацию по итерируемому объекту, в этом случае массив , Он управляет телом цикла для каждого элемента массива, назначая имя «Arr» текущему элементу. Узел 6+ должен иметь поддержку 'let'; 4 и 5 имеют [частичную поддержку] (http://kangax.github.io/compat-table/es6/#test -let), хотя они не имеют надлежащей области блока. –

+0

@UselessCode, Ye, я получаю ошибку объявления с блочной областью, когда я использую 'let'. Я думаю, что пришло время обновить :) Спасибо за ваше объяснение – Bongskie