Программа не перечисляет в JavaScript - PullRequest
5 голосов
/ 13 марта 2020

Я пытаюсь написать программу, которая принимает данные (library, authorName) и возвращает название книг, которые написал автор.

Библиотека выглядит так:

let library = [
  { author: 'Bill Gates', title: 'The Road Ahead', libraryID: 1254 },
  { author: 'Carolann Camilo', title: 'Eyewitness', libraryID: 32456 },
  { author: 'Carolann Camilo', title: 'Cocky Marine', libraryID: 32457 }
];

Мой код выглядит так:

let library = [
  { author: 'Bill Gates', title: 'The Road Ahead', libraryID: 1254 },
  { author: 'Carolann Camilo', title: 'Eyewitness', libraryID: 32456 },
  { author: 'Carolann Camilo', title: 'Cocky Marine', libraryID: 32457 }
];

function searchBooks(library, author) {
  for (author in library) { //enumerate
    if (author in library) {
      let line = Object.values(library[0]) // find line of the wanted author
      let result = (line[0] + "," + line[1]) // store author name and title name
      return result
    } else {
      return "NOT FOUND"
    }
  }
}

console.log(searchBooks(library, 'Bill Gates'))

Вывод выглядит так: Bill Gates,The Road Ahead

Проблема : Неважно, какого автора я буду вводить в searchBook возвращается Билл Гейтс, первая строка библиотеки. Таким образом, это не перечислять, я думаю. Но почему бы и нет?

Сначала я подумал, может быть, мне следует избегать жесткого кодирования [0] и [1] и вместо этого использовать i и i ++. Но, похоже, это тоже не работает, так как выводит TypeError: Cannot convert undefined or null to object

Ответы [ 4 ]

3 голосов
/ 13 марта 2020

Несколько вещей:

  1. for (author in library) ищет каждый ключ вашего библиотечного массива, вместо этого используйте of, который оценивает каждое значение. Поскольку это объект, я назвал это значение book
  2. ваш result может иметь много значений, поэтому лучше всего сделать его массивом или коллекцией некоторого вида, которые вы можете складывать в ответах
  3. if (author in library) проверяет, является ли ваш автор ключом в исходном массиве библиотеки, опять же, нежелательно. Вы действительно хотите увидеть, является ли author значением объекта. В частности, вы хотите, чтобы ваш автор был значением ключа автора объекта. Итак, book.author == author
  4. ваш результат является массивом, поэтому объедините значения с новой строкой; если в вашем результирующем массиве нет элементов, то это будет пустая строка, которая является значением Falsey. В этом случае вы можете вернуть сообщение NOT FOUND. В противном случае вы хотите вернуть все книги

let library = [
  { author: 'Bill Gates', title: 'The Road Ahead', libraryID: 1254 },
  { author: 'Carolann Camilo', title: 'Eyewitness', libraryID: 32456 },
  { author: 'Carolann Camilo', title: 'Cocky Marine', libraryID: 32457 }
];

function searchBooks(library, author) {
  let result = []

  for (let book of library) {
    if (book.author == author) {
      let line = Object.values(book)       // find line of the wanted author
      result.push(line[0] + "," + line[1]) // store author name and title name
    }
  }

  return result.join('\n') || 'NOT FOUND'
}

console.log(1, searchBooks(library, 'Carolann Camilo'))
console.log(2, searchBooks(library, 'Bill Gates'))
console.log(3, searchBooks(library, 'Oh boy'))

Примечание:

  • Как избежать Object.values См. этот ответ
  • Как чтобы перебрать библиотеку только для нужных книг (используя filter), найдите этот ответ
  • Для другого способа перебрать библиотеку (используя forEach), найдите this ответ
1 голос
/ 13 марта 2020

Вы можете использовать Array.filter ( см. MDN ):

const library = [
  { author: 'Bill Gates', title: 'The Road Ahead', libraryID: 1254 },
  { author: 'Carolann Camilo', title: 'Eyewitness', libraryID: 32456 },
  { author: 'Carolann Camilo', title: 'Cocky Marine', libraryID: 32457 }
];

console.log(findAuthor(library, `Bill Gates`));

function findAuthor(library, author) {
  return library.filter(book => book.author === author);
}
0 голосов
/ 13 марта 2020

Вы можете использовать forEach для l oop над элементами и добавлять их к заданному результату для нескольких записей одного и того же автора.

let library = [
  {author: 'Bill Gates', title: 'The Road Ahead', libraryID: 1254 },
  { author: 'Carolann Camilo', title: 'Eyewitness', libraryID: 32456 },
  { author: 'Carolann Camilo', title: 'Cocky Marine', libraryID: 32457 }
];
function search(library, author) {
  let result = ""
  library.forEach(l => {
    if (l.author === author) {
      result += l.author+", "+l.title+"\n"
    }
  })
  return result
}

console.log(search(library, "Carolann Camilo"))
0 голосов
/ 13 марта 2020

Вот рабочая версия вашего подхода:

let library = [
    { author: 'Bill Gates', title: 'The Road Ahead', libraryID: 1254 },
    { author: 'Carolann Camilo', title: 'Eyewitness', libraryID: 32456 },
    { author: 'Carolann Camilo', title: 'Cocky Marine', libraryID: 32457 }
];

function searchBooks(library, author) {
    for (const book of library) { //enumerate
        if (book.author === author) {
            let result = (book.author + "," + book.title) // store author name and title name
            return result
        }
    }
    return 'NOT FOUND'
}

console.log(searchBooks(library, 'Bill Gates'))
  • Сначала выполните итерацию book с library, а не автора.

  • Затем выясните, равен ли author из book author, который вы хотите найти.

  • Затем выведите author и title этого книга, разделенная запятой.

Также учтите, что возвращается только первое совпадение, а не все совпадения.

...