首页 > 解决方案 > 程序不在 JavaScript 中枚举

问题描述

我正在尝试编写一个程序,该程序接受输入(图书馆,作者姓名)并返回作者所写书籍的标题。

图书馆看起来像这样:

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

标签: javascriptenumeration

解决方案


一些东西:

  1. for (author in library)正在查找库数组的每个键,而不是使用ofwhich 评估每个值。因为它是一个对象,所以我命名了那个值book
  2. result可能有很多值,因此最好将其设为某种数组或集合,您可以将响应堆叠在
  3. if (author in library)检查您的作者是否是原始库数组中的键,这也是不希望的。你真的想看看是否author是对象的值。更具体地说,您希望您的作者是对象作者键的值。所以book.author == author
  4. 你的结果是一个数组,所以用换行符加入这些值;如果结果数组中没有项目,它将是一个空字符串,这是一个错误值。在这种情况下,您可以回复您的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),请寻求此答案

推荐阅读