Как обновить значение объекта JSON в Node.js - PullRequest
0 голосов
/ 26 апреля 2019

Мой Javascript взаимодействует со следующими 2 файлами JSON:

readers.json:

[
    {
    "readerID": 1,
    "name": "Maria",
    "weeklyReadingGoal": 350,
    "totalMinutesRead": 5600,
    "bookID": 65
    },
    {
    "readerID": 2,
    "name": "Daniel",
    "weeklyReadingGoal": 210,
    "totalMinutesRead": 3000,
    "bookID": 65
    }
]

Books.json

[
    {
    "bookID": 65,
    "title": "Goodnight Moon",
    "author": "Margaret Wise Brown",
    "publicationYear": "1953"
    },
    {
    "bookID": 75,
    "title": "Winnie-the-Pooh",
    "author": "A. A. Milne",
    "publicationYear": "1926"
    }
]

На данный момент я могу УДАЛИТЬ книгу из book.json

Когда я удаляю книгу, и bookID этой книги существует в reader.json объекте, я хочу обновить этот идентификатор до 0.

Например, если я удаляю книгу, где bookID = 65, я хочу изменить все bookID, которые равны 65 в reader.json , на ноль.

Ниже приведен мой код, при необходимости я могу предоставить дополнительный код:

Books.js:

var data = getBookData();

var pos = data.map(function (e) {
  return e.bookID;
}).indexOf(parseInt(req.params.id, 10));

if (pos > -1) {
  data.splice(pos, 1);
} else {
  res.sendStatus(404);
}

saveBookData(data);

var readerData = getReaderData();
var bookID = req.params.id;
console.log('BOOK ID - ' + bookID); // prints: BOOK ID - 47
readerData.forEach(function (x) {
  if (x.bookID === bookID) {
    x.bookID = null;
  }
  else {
    console.log('Deleted book was not associated with any reader');
    console.log('BOOK ID in else - ' + x.bookID); // prints: BOOK ID in else - 47
  }
});

saveReaderData(readerData);
res.sendStatus(204);
});

function getReaderData() {
    var data = fs.readFileSync(readerFile, 'utf8');
    return JSON.parse(data);
}

Когда я запускаю этот код, книга удаляется из books.json , но соответствующие идентификаторы bookID в reader.json остаются теми же.

Кроме того, в блоке else, указанном выше, регистрируются соответствующие идентификаторы bookID, но по какой-то причине код не поступает в блок if.

1 Ответ

0 голосов
/ 26 апреля 2019

Вы можете зациклить считыватели и выполнить проверку bookID.Это то, что вы хотели?

Ваша ошибка - использовать indexOf в массиве, потому что он вернет вам только первое совпадение.

const readerData = [{
    "readerID": 1,
    "name": "Maria",
    "weeklyReadingGoal": 350,
    "totalMinutesRead": 5600,
    "bookID": 65,
  },
  {
    "readerID": 1,
    "name": "Maria",
    "weeklyReadingGoal": 350,
    "totalMinutesRead": 5600,
    "bookID": 70,
  },
  {
    "readerID": 2,
    "name": "Daniel",
    "weeklyReadingGoal": 210,
    "totalMinutesRead": 3000,
    "bookID": 65,
  },
];

const bookID = 65;

// Treat every reader
readerData.forEach((x) => {
  // If the bookID is the one we are looking for, set it as null
  if (x.bookID === bookID) {
    x.bookID = null;
  }
});

console.log(readerData);

Итак.Применительно к вашему коду

var readerFile = 'server/data/readers.json';

router.route('/')
  .delete(function(req, res) {
    var readerData = getReaderData();

    var bookID = parseInt(req.params.id, 10);

    // Have we found any occurence of the bookID ?
    var found = false;

    // Treat every reader
    readerData.forEach(function(x) {
      // If the bookID is the one we are looking for, set it as null
      if (x.bookID === bookID) {
        x.bookID = null;

        found = true;
      }
    });

    // If we haven't found any occurence, returns an error
    if (!found) {
      res.sendStatus(404);

      return;
    }

    // Save the changes
    saveReaderData(readerData);

    res.sendStatus(204);
  });

function getReaderData() {
  var data = fs.readFileSync(readerFile, 'utf8');

  return JSON.parse(data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...