从 API 向数组添加多个值并避免 "undefined" 错误

Adding multiple values to array from an API and avoiding "undefined" error

我正在将 GoogleBooks API 用于一个小的副项目,并且 运行 遇到了一个小问题。问题是有时数据不统一——缩略图图像会丢失或作者信息会丢失。当脚本运行以将搜索到的元素“添加”到数据库时,它 return 是一个错误,因为其中一个值将 return 未定义。也许举个例子会更清楚:

let volumeInfo = response.items[i].volumeInfo
    var book = {
        title: volumeInfo.title, 
        authors: volumeInfo.authors[0], 
        selfLink: response.items[i].selfLink
        cover: volumeInfo.imageLinks.thumbnail
    }

例如,我偶尔遇到的一个错误是“TypeError:无法读取未定义的 属性 '0':对于其中一个结果。我发现有效的修复如下:

var book = {
     title: volumeInfo.title, 
     authors: volumeInfo.authors[0], 
     selfLink: response.items[i].selfLink
     }
  if(volumeInfo.authors === undefined){
     book.authors = "null"
  }
  else{
     book.authors = volumeInfo.authors[0]
  }
  if(volumeInfo.imageLinks === undefined){
     book.cover = "null" 
  } else {
     book.cover = volumeInfo.imageLinks.thumbnail
  }

有没有更优雅的方法来做到这一点,而不必为我想从中创建对象的所有元素编写“if”语句?

您可以使用 optional chaining with nullish coalescing:

var book = {
  title: volumeInfo.title,
  authors: volumeInfo.authors?[0] ?? 'null',
  selfLink: response.items[i].selfLink,
  cover: volumeInfo.imageLinks?.thumbnail ?? 'null',
}

如果您并不完全需要 'null' 字符串,而只想在其中放置一个值以指示未找到任何内容,您可以删除 ?? 以使值默认为 undefined 当没有 属性 时,它会使代码更短一些:

var book = {
  title: volumeInfo.title,
  authors: volumeInfo.authors?[0],
  selfLink: response.items[i].selfLink,
  cover: volumeInfo.imageLinks?.thumbnail,
}

请注意,这是非常新的语法。如果您要将此代码放在 public 网站上供一般用户使用,并且您有一个 decently-sized 相当专业的项目,请确保 Babel 将您的代码转译为 ES5(或ES6) 用于生产,以便旧版浏览器可以理解它。

否则,您可以手动执行未定义的测试。要将最后一个片段翻译成 ES5:

var book = {
  title: volumeInfo.title,
  authors: volumeInfo.authors ? volumeInfo.authors[0] : undefined,
  selfLink: response.items[i].selfLink,
  cover: volumeInfo.imageLinks ? volumeInfo.imageLinks.thumbnail : undefined
}

有点冗长 - 我更喜欢 Babel,希望你已经在使用它了。