img src 的三进制,返回值或默认值

Posted

技术标签:

【中文标题】img src 的三进制,返回值或默认值【英文标题】:Ternary for img src, returned value or default value 【发布时间】:2022-01-13 17:06:46 【问题描述】:

我是一名学生,正在构建一个用于与 Google Books API 交互的简单网络应用。我生成了一个随机词作为 Google 图书搜索参数,它以 JSON 格式正确返回。

问题是,有些书没有“作者”/“描述”/“图像”参数来返回。对于 Author/Desc,我已经使用三元组轻松解决了这一问题,但是对于图像源来说,三元组的效果并不好。

我想要实现的目标 - 如果 Google 图书查询具有 Image 值,则返回该图像:ELSE,返回我选择的默认值,在本例中为“http://clipart-library.com/ newimages/clip-art-books-15.png'。我宁愿不编辑 html 来实现这一点。

也许有比通过三进制更好的方法来做到这一点。谁能给点建议?

const testBookImg2 是三重焦点。

fetch (randomWord)
    .then (res => res.json())
    .then (obj => 
        console.log(obj)
        fetch (gbooks + obj[0])
        .then (res => res.json())
        .then (obj2 => 
            const testdesc1 = obj2.items[0].volumeInfo.description
            const testdesc2 = typeof(testdesc1) !== 'undefined' ? testdesc1 : 'No Description Provided'
            const testAuthor1 = obj2.items[0].volumeInfo.authors
            const testAuthor2 = typeof(testAuthor1) !== 'undefined' ? testAuthor1 : 'No Author'
            selectedBookDescription.innerText = testdesc2
            selectedBookAuthor.innerText = testAuthor2
            selectedBookTitle.innerText = obj2.items[0].volumeInfo.title

            const testBookImg1 = obj2.items[0].volumeInfo.imageLinks.thumbnail
            const testBookLink = 'http://clipart-library.com/newimages/clip-art-books-15.png'
            const testBookImg2 = typeof(testBookImg1) !== 'undefined' ? testBookImg1 : `$testBookLink`

            selectedBookImage.src = testBookImg2
        )
    )

【问题讨论】:

Object.hasOwnProperty怎么样? 你能帮我拼一下吗?我是一名使用辅助轮的学生。 我对图片的看法不是改变src元素,而是加载所有图片并隐藏不应该看到的图片 给你:developer.mozilla.org/en-US/docs/Web/javascript/Reference/…. @WaisKamal 为什么你认为这会比测试类型更好? 【参考方案1】:

问题是没有imageLinks 属性,因此尝试读取undefinedthumbnail 属性时会出错。

使用optional chaining 运算符来防止出现此错误。如果存在,它将分配属性的值,如果不存在或任何中间属性不存在,则分配 undefined

const testBookImg1 = obj2.items[0]?.volumeInfo?.imageLinks?.thumbnail;
const testBookLink = 'http://clipart-library.com/newimages/clip-art-books-15.png';
const testBookImg2 = typeof testBookImg1 !== 'undefined' ? testBookImg1 : || testBookLink;

没有必要在testBookLink 周围使用模板文字,因为它已经是一个字符串。

如果任何中间属性不存在,这会将testBookImg1 设置为undefined

【讨论】:

不幸的是,该属性不存在,例如这里 googleapis.com/books/v1/volumes?q=peridot 如果您查看 [0]/volumeInfo 则没有 'imageLinks.thumbnail' 键。 根本没有imageLinks 属性,因此您在尝试读取未定义属性时遇到错误。 没错,我知道。所以,我的问题是,如果值返回未定义,我如何返回默认的 img src? 我已经更新了答案。 我不想将 testBookImg1 设置为未定义。如果未定义 testBookImg1,则它已经返回未定义。如果它返回 undefined 我想将其设置为默认 URL。【参考方案2】:

有几种方法可以处理对象上的可选键:

const obj = 
  key1: "val1",


const keyIn = (key, obj) => key in obj
const hasOwnProperty = (key, obj) => obj.hasOwnProperty(key)

console.log('key1 in obj', keyIn('key1', obj))
console.log('key2 in obj', keyIn('key2', obj))
console.log('key1 hasOwnProperty with obj', hasOwnProperty('key1', obj))
console.log('key2 hasOwnProperty with obj', hasOwnProperty('key2', obj))

另外,您可以使用nullish coalescing operator - ??

(function() 
  const testBookImg1 = 'valid string'
  const testBookLink = 'http://clipart-library.com/newimages/clip-art-books-15.png'
  const testBookImg2 = testBookImg1 ?? testBookLink
  console.log('testBookImg2', testBookImg2)
)();

(function() 
  const testBookImg1 = undefined
  const testBookLink = 'http://clipart-library.com/newimages/clip-art-books-15.png'
  const testBookImg2 = testBookImg1 ?? testBookLink
  console.log('testBookImg2', testBookImg2)
)();

编辑:

// mock object
const obj2 = 
  items: [
    volumeInfo: 
      imageLinks: 
        thumbnail: 'valid thumbnail src'
      
    
  ]


const testBookImg1 = obj2?.items[0]?.volumeInfo?.imageLinks?.thumbnail
const testBookLink = 'http://clipart-library.com/newimages/clip-art-books-15.png'
const testBookImg2 = testBookImg1 ?? testBookLink

console.log('testBookImg2', testBookImg2)

// the same, just a suffix added, so it doesn't crash:

const obj2_undefined = 
  items: [
    volumeInfo: 
  ]


const testBookImg1_undefined = obj2_undefined?.items[0]?.volumeInfo?.imageLinks?.thumbnail
const testBookLink_undefined = 'http://clipart-library.com/newimages/clip-art-books-15.png'
const testBookImg2_undefined = testBookImg1_undefined ?? testBookLink_undefined

console.log('testBookImg2_undefined', testBookImg2_undefined)

【讨论】:

我是 JS 新手,不明白如何将您的答案转化为解决方案,但还是谢谢您。 @Michael 添加了一个编辑,所以你可以看到确切的方式

以上是关于img src 的三进制,返回值或默认值的主要内容,如果未能解决你的问题,请参考以下文章

python函数使用多个默认值或根本没有默认值

如何在 select2 yii2 中设置选定值或默认值?

默认值或值不适用于 FormItem ANTD

Mongoid 按值或默认值查询

如何在 Elementor SELECT2 控件上指定默认值或几个值?

Xcode 6 为布局边距设置默认值或禁用它们