Цикл for. Есть ли возможность в цикле перебросить входящее значение на другой объект?
Есть часть кода. В цикл с фронта будут приходить страницы, которые сравниваются с количеством страниц в книге с массива и по результату, если количество входящих страниц больше, чем страниц в книге - она закрывается. Вопрос: можно ли реализовать, что бы разницу страниц(переполнение) перебрасывать на следующую книгу в массиве?
for (let i = 0; i < training.books.length; i++) {
book = await Book.findOne({ _id: training.books[i] });
if (book?.numberOfPages === book?.readPages) {
continue;
}
book.readPages += pages;
if (book.readPages > book.numberOfPages) {
book.readPages = book.numberOfPages;
}
await book.save();
break;
}
...
});
Например пришло 25 страниц c const { pages: 25 } = req.body;
они попадают в book.readPages += pages; первой книги
после чего сравнивается прочитанные страницы book.readPages: 25
со страницами в книге у которой общее количество страниц 15 book.numberOfPages: 15
и через if в коде выше если book.readPages > book.numberOfPages то book.readPages = book.numberOfPages
и в ответе приходит по первой книге
{readPages: 15, numberOfPages: 15}
как оставшиеся 10 страниц перебросить в book.readPages: 10 второй книги у которой book.numberOfPages: 99
и при следующем const { pages: 25 } = req.body;
у второй книги уже в book.readPages: 35, а не book.readPages: 25
надеюсь уточнил вопрос?
=======================
Попробовал, нужного мне результата нет, после ввода
const { pages: 49 } = req.body;
пришел ответ
{
"date": "2021-04-22 19:42:45",
"pageCount": 49
}
книга1 закрылась как и раньше
"book1": {
"readPages": 45,
"numberOfPages": 45,
}
при следующем добавлении
const { pages: 7 } = req.body;
ответ
{
"date": "2021-04-22 19:42:45",
"pageCount": 49
},
{
"date": "2021-04-22 19:52:37",
"pageCount": 7
}
книга2 получает в readPages только второй запрос, разница в 4 страницы в нее не попала
"book2": {
"readPages": 7,
"numberOfPages": 19,
}
UPD
if (book?.numberOfPages === book?.readPages) {
// totalPages -= book.numberOfPages; здесь нужен ?
continue;
}
здесь не нужно
Ответы (1 шт):
Нужна внешняя переменная, которая будет хранить сумму всех прилетевших страниц. Пробуйте:
let totalPages = 0;
// Число может храниться и в каком-то объекте / файле.
const { pages } = req.body;
totalPages += pages; // <--
/***/
for (let i = 0; i < training.books.length; i++) {
book = await Book.findOne({ _id: training.books[i] });
if (book?.numberOfPages === book?.readPages) {
// totalPages -= book.numberOfPages; здесь нужен ?
continue;
}
book.readPages += totalPages; // <--
if (book.readPages > book.numberOfPages) {
book.readPages = book.numberOfPages;
totalPages -= book.numberOfPages; // <--
}
await book.save();
break;
}
//...