Замена всего блока данных в файле JSON - PullRequest
1 голос
/ 02 марта 2020

Я ищу способ заменить группу данных в файле JSON без замены другой его части:

{
  "task": [
    {
      "id": 5,
      "title": "dave",
      "description": "test"
    },
    {
      "id": 6,
      "title": "fddsfsd",
      "description": "fsdfsd"
    },
    {
      "id": 7,
      "title": "fddsfssdfsdfd",
      "description": "fsdfsd"
    },
    {
      "id": 8,
      "title": "fddsfssdfsdfd",
      "description": "fsdfsd"
    }
  ],
  "compteur": [
    {
      "id": 8
    }
  ]
}

Мне удается получить все, что находится между скобками " задача »в переменной. Моя текущая проблема заключается в том, что мне нужно заменить только то, что находится внутри скобки, и не влиять на другие части файла.

Это мой код для извлечения данных «задач»:

    function RemoveNode(idToDelete) {
      return jsonData.task.filter(function(emp) {
        if (emp.id == idToDelete) {
          return false;
        }
        return true;
      });
    }
    var newData = RemoveNode(idToDelete);
    arr1 = JSON.stringify(newData, null, 4);
    console.log("arr1", arr1);

console.log дает мне:

arr1 [
    {
        "id": 5,
        "title": "dave",
        "description": "test"
    },
    {
        "id": 6,
        "title": "fddsfsd",
        "description": "fsdfsd"
    },
    {
        "id": 8,
        "title": "fddsfssdfsdfd",
        "description": "fsdfsd"
    }
]

Мне действительно нужно заменить это в оригинальном JSON файле, но я абсолютно не знаю, как этого добиться.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Вы можете использовать оператор распространения, это заменит данные задачи с вашими новыми отфильтрованными данными

function RemoveNode(idToDelete) {
  return jsonData.task.filter(function(emp) {
    if (emp.id == idToDelete) {
      return false;
    }
    return true;
  });
}
var newData = RemoveNode(idToDelete);
var updatedJSONData = {...jsonData, task: newData};

Вы также можете сделать это на месте, используя forEach вместо filter, это более эффективный с точки зрения памяти

function RemoveNode(idToDelete) {
    jsonData.task.forEach((t, index) => {
        if (t.id === idToDelete) {
            jsonData.task.splice(index, 1);
        }
    });
}
0 голосов
/ 02 марта 2020

Если ваш JSON файл не слишком большой, вы можете изменить массив задач в вашем JS объекте (после того, как вы прочитали или импортировали его в свою программу), а затем переписать файл json .

JSON файл до запуска программы:

{
  "task": [
    {
      "id": 5,
      "title": "dave",
      "description": "test"
    },
    {
      "id": 6,
      "title": "fddsfsd",
      "description": "fsdfsd"
    },
    {
      "id": 7,
      "title": "fddsfssdfsdfd",
      "description": "fsdfsd"
    },
    {
      "id": 8,
      "title": "fddsfssdfsdfd",
      "description": "fsdfsd"
    }
  ],
  "compteur": [
    {
      "id": 8
    }
  ]
}

Допустим, мы хотим удалить объекты задачи с id = 6. Код:

const myFileContents = require('./myFile.json');
const fs = require('fs');

const removeIdFromTasks = (taskList,idToRemove) => {
    return taskList.filter(task => task.id!=idToRemove);
}

const writeJsonFile = (fileName,content) => {
    fs.writeFile(fileName,content,(err) => {
        if(err){
            console.error(`Error in writing json file: ${e.message}`);
        } else {
            console.log(`File written`);
        }
    })
}

myFileContents.task = removeIdFromTasks(myFileContents.task,6);
writeJsonFile(`myFile.json`,JSON.stringify(myFileContents));

Тот же файл после исполнения:

{
    "task": [
    {
        "id": 5,
        "title": "dave",
        "description": "test"
    },
    {
        "id": 7,
        "title": "fddsfssdfsdfd",
        "description": "fsdfsd"
    },
    {
        "id": 8,
        "title": "fddsfssdfsdfd",
        "description": "fsdfsd"
    }],
    "compteur": [
    {
        "id": 8
    }]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...