Выберите, чтобы обновить или отправить в массив, используя javascript es5 - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь push объект в массив объектов, но только если конкретный object не присутствует в массиве. Если он присутствует, объект должен быть обновлен.

Я должен сделать это с es5

Ниже я попробовал

var database = require('../../database');
var autoincrementId = require('../../helpers/autoincrement-id');
var books = database.Books;

function Book(title, author, summary) {
  this.title = title;
  this.author = author;
  this.summary = summary;
}

Book.prototype.createBook = function () {
  var id = autoincrementId(id, database.Books); //autoincrement database id
  var copies = 1;
  var title = this.title.toLowerCase(), author = 
this.author.toLowerCase(), summary = this.summary.toLowerCase();
  if (!books.length) {
    books.push({id: id, title: title, author: author, summary: summary, copies: copies});
  } else {
     for(var book in books) {
      if(books[book].title === title) {
        books[book].copies += 1;
       break;
      }
      books.push({id: id, title: title, author: author, summary: summary, copies: copies});
    }
  }
};

Но когда я запускаю следующее

var abook = new Book('J', 'k', 'l');
var bbook = new Book('M', 'N', 'o');
abook.createBook();
abook.createBook();
bbook.createBook();
bbook.createBook();

console.log(books);

Я получаю следующее

[ { id: 1, title: 'j', author: 'k', summary: 'l', copies: 2 },
  { id: 2, title: 'm', author: 'n', summary: 'o', copies: 2 },
  { id: 3, title: 'm', author: 'n', summary: 'o', copies: 1 } ]

Вместо

[ { id: 1, title: 'j', author: 'k', summary: 'l', copies: 2 },
  { id: 2, title: 'm', author: 'n', summary: 'o', copies: 2 }]

Может кто-нибудь помочь мне разобраться в проблеме с этим кодом. Почему он обновляется и вставляется во второй раз и как я могу решить эту проблему?

1 Ответ

3 голосов
/ 14 мая 2019

В вашем цикле for(var book in books) { вы проверяете, равна ли текущая книга новой, а затем, если это не так, вы добавляете ее. если книга на самом деле является второй в списке, она будет добавлена, поскольку первая проверенная книга не является новой. Возможно, вам понадобится флаг, чтобы книга не была найдена:

var BookNotFound = true; // by default, no book found
for(var book in books) {
    if(books[book].title === title) {
        books[book].copies += 1;
        BookNotFound = false; // <------- a book was found
        break;
    }
}
// Outside of the loop :
if (BookNotFound)
    books.push({id: id, title: title, author: author, summary: summary, copies: copies});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...