Как преобразовать несколько циклов For в один?

#javascript #for-loop

#javascript #for-цикл

Вопрос:

Как вы можете преобразовать эту функцию? Я чувствую, что вложенный цикл for будет работать, но я не понял, как заставить его работать.

Вот функция:

 class Librarian {
  constructor(name, library) {
    this.name = name;
    this.library = library;
  }
findBook(bookTitle) {
    for (var i = 0; i < this.library.shelves.fantasy.length; i  ){
      if (bookTitle === this.library.shelves.fantasy[i].title){
        this.library.shelves.fantasy.splice(i, 1);
        return `Yes, we have ${bookTitle}`;
      }
    } for (var i = 0; i < this.library.shelves.fiction.length; i  ){
      if (bookTitle === this.library.shelves.fiction[i].title){
        this.library.shelves.fiction.splice(i, 1);
        return `Yes, we have ${bookTitle}`;
      }
    } for (var i = 0; i < this.library.shelves.nonFiction.length; i  ){
      if (bookTitle === this.library.shelves.nonFiction[i].title){
        this.library.shelves.nonFiction.splice(i, 1);
        return `Yes, we have ${bookTitle}`;
      }
    } return `Sorry, we do not have ${bookTitle}`;
  } 
}
  

Вот моя попытка:

 findBook(bookTitle) {
    for (var j = 0; j < this.libray.shelves.length; j  ) {
      for (var i = 0; i < this.library.shelves[i].length; i  ){
        if (bookTitle === this.library.shelves[j].title){
          this.library.shelves[j].splice(i, 1);
          return `Yes, we have ${bookTitle}`;
        }
      }
    } return `Sorry, we do not have ${bookTitle}`;
}
  

Комментарии:

1. shelves Похоже, что это объект, а не массив, поэтому вам нужно будет использовать for … in для них.

2. @Bergi или использовать что-то вроде Object.values(...)

Ответ №1:

Получите названия жанров, а затем выполните цикл над ними:

 findBook(bookTitle) {
  const genres = Object.keys(this.library.shelves);
  for (var i = 0; i < genres.length; i  ) {
    const genre = genres[i];
    for (var j = 0; j < this.library.shelves[genre].length; j  ) {
      if (bookTitle === this.library.shelves[genre][j].title) {
        this.library.shelves[genre].splice(i, 1);
        return `Yes, we have ${bookTitle}`;
      }
    }
  }
  return `Sorry, we do not have ${bookTitle}`;
}  

Ответ №2:

Похоже, вы действительно близки к тому, чтобы заставить это работать, вам просто нужно повторить this.library.shelves[j].length во втором цикле for вместо i . Затем вам нужно получить доступ к i-му элементу j-й полки.

 findBook(bookTitle) {
   for (var j = 0; j < this.libray.shelves.length; j  ) {
      for (var i = 0; i < this.library.shelves[j].length; i  ){
         if (bookTitle === this.library.shelves[j][i].title){
            this.library.shelves[j].splice(i, 1);
            return `Yes, we have ${bookTitle}`;
         }
      }
   } 
   return `Sorry, we do not have ${bookTitle}`;
}
  

Комментарии:

1. Ах, не видел свойств жанра в исходном коде. ответ @marzelin хорош.