如何在不迭代的情况下访问数组中的特定元素?

Posted

技术标签:

【中文标题】如何在不迭代的情况下访问数组中的特定元素?【英文标题】:How to access a specific element out of an array without iterating? 【发布时间】:2020-03-27 04:28:29 【问题描述】:

我有以下文件夹结构

/images
/images/pic1.jpg
/images/pic2.jpg

使用以下 GraphQL 查询时..

query MyQuery1 
  file(sourceInstanceName: eq: "images", name: eq: "pic1") 
    name
    publicURL
  

可以使用<img src=data.file.publicUrl alt="" /> 之类的方式访问结果。到目前为止,一切都很好。

但现在我想通过一个查询从该文件夹中检索多个图像。所以我想出了以下内容:

query 
  allFile(
    filter: 
      sourceInstanceName:  eq: "images" 
      name:  in: ["pic1", "pic2"] 
    
  ) 
    nodes 
      name
      publicURL
    
  

太棒了!但是,我现在如何无需使用map 或遍历结果就可以访问其中一张图片?

我正在寻找这样的东西,这当然行不通:

<img src=data.file.publicUrl name.eq="pic1" alt="pic1"/>

也不是这样的:

<img src=data.allFile.nodes.0.publicUrl alt="pic1" />

我想使用gatsby-image 来优化和调整我的图像大小。这就是我选择 GraphQL 方式而不是直接导入的原因。我在错误的轨道上吗?

【问题讨论】:

【参考方案1】:

我自己想出来的。我不知道可以将事物链接 在一起。这对我有用。

query 
  imageOne: file(sourceInstanceName: eq: "images", relativePath: eq: "pic1.jpg") 
    id
    childImageSharp 
      fixed(width: 30) 
        base64
        tracedSVG
        aspectRatio
        width
        height
        src
        srcSet
        srcWebp
        srcSetWebp
        originalName
      
    
  
  imageTwo: file(sourceInstanceName: eq: "images", relativePath: eq: "pic2.jpg") 
    id
    childImageSharp 
      fixed(width: 30) 
        base64
        tracedSVG
        aspectRatio
        width
        height
        src
        srcSet
        srcWebp
        srcSetWebp
        originalName
      
    
  

然后像这样访问它:

<Img fixed=data.imageOne.childImageSharp.fixed  />

<Img fixed=data.imageTwo.childImageSharp.fixed  />

P.S:这是gatsby-config.js中的相关部分


  resolve: `gatsby-source-filesystem`,
  options: 
    name: `images`, <<== gets filtered by sourceInstanceName: ..
    path: `$__dirname/src/images/`,
  ,
,
`gatsby-transformer-sharp`,
`gatsby-plugin-sharp`,

【讨论】:

【参考方案2】:

OP 回答了他们自己的问题,但这里有另一种方式:使用 Array.prototype.filter

const Index = (props) => 
  const  data:  allFile:  edges    = props;

  const heroImage = edges.filter
    (el => el.node.childImageSharp.fluid.originalName === "heroImage.png")
      [0].node.childImageSharp.fluid;
  // ...


export const query = graphql`

  allFile(filter: 
    extension: eq: "png",
    sourceInstanceName: eq: "images",
    sort: fields: [childImageSharp___fluid___originalName], order: ASC)
  
    edges 
      node 
      childImageSharp 
          fluid(maxWidth: 300, quality: 50) 
            originalName
            ...GatsbyImageSharpFluid
          
        
      
    
  

`;

【讨论】:

以上是关于如何在不迭代的情况下访问数组中的特定元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重复预定义三元组中的特定元素的情况下随机化向量?

如何在不干扰主数组的情况下以 7 角拼接数组中的元素

如何在不“连接”它们的情况下以编程方式访问 NIB 中的 UI 元素?

如何在不使用 max() 或对其进行迭代的情况下找到堆栈中的最大整数值?

如何在不使用输入元素的情况下捕获 Vuejs 中的任何按键事件

在不转换为数组的情况下迭代 NodeList 并移动其元素的惯用方法是啥?