【问题标题】:How to access objects in Jekyll array?如何访问 Jekyll 数组中的对象?
【发布时间】:2017-10-26 17:00:22
【问题描述】:

我的 Jekyll 页面代码如下(简化):

_layouts/content.html:

---
layout: null
---
<pre>
    {{ content }}
</pre>

any_page.md

---
layout: content
social:
    - twitter :
        url : "https://twitter.com"
        user : "foo"
        show : true
    - instagram : 
        url : "https://instagram.com"
        user : "bar"
        show : false
---

我对上面any_page.md的理解是

  • social 是具有项目 0、1 的对象的 arraysocial[0] 等于 * twitter。这些键可以是可变的。
  • 上述数组中的每个数组项为social[i];具有相似已知键(url、user、show)的对象

问题:

如何访问 page.social[i]["url"] 和其他两个已知键?
如何访问驻留在可变长度数组中的对象的这些已知键?
如何获得以下输出:twitterhttps://twitter.comfootrue

我尝试过的代码:

所有社交数组:{{ page.social }} 输出(如预期)

  {“twitter”=>
    { “url”=>”https://twitter.com”,
      “user”=>”foo”,
      “show”=>true
    }
  }
  {“instagram”=>
    { “url”=>”https://instagram.com”,
      “user”=>”bar”,
      “show”=>false
    }
  }

社交数组的第一个对象:{{ page.social[0] }} 输出(如预期)

{“twitter”=>
    { “url”=>”https://twitter.com”,
      “user”=>”foo”,
      “show”=>true
    }
  }

尝试访问项目 01 的 url 失败(所有结果为空):

{{ page.social[0]["url"] }}  
{{ page.social[0][url] }}  
{{ page.social[0]."url" }}  
{{ page.social[0].url }}  
{{ page.social[0][0] }}  

附录:

我也尝试过 for 循环; & 它给出了根级别的所有值(twitter 等),但无法访问对象键:

{% for item in page.social %}  
    item = {{ item }}                # works
    item[URL] = {{ item[url] }}      # empty
    item["URL"] = {{ item["url"] }}  # empty
    item."URL" = {{ item."url" }}    # empty
    item.URL = {{ item.url }}        # empty
    i = {{forloop.index }}           # ok, but starts from 1 instead of 0
{% endfor %}  

【问题讨论】:

    标签: arrays object jekyll liquid


    【解决方案1】:

    这将起作用:

    twitter key: {{page.social[0]|first|first}} 
    <h2>data</h2>
    url: {{page.social[0]['twitter'].url}}
    user: {{page.social[0]['twitter'].user}}
    show: {{page.social[0]['twitter'].show}}
    

    另一种方法

    social:
      twitter :
         url : "https://twitter.com"
         user : "foo"
         show : true
      instagram : 
         url : "https://instagram.com"
         user : "bar"
         show : false
    

    然后你可以通过以下方式访问它:

    {% for item in page.social%}
    key: {{item[0]}}<br>
    {% endfor %}
    <hr>
    <h2>data</h2>
    url: {{page.social['twitter'].url}}
    user: {{page.social['twitter'].user}}
    show: {{page.social['twitter'].show}}
    

    【讨论】:

    • 谢谢,如果您能解释一下我的减速是如何导致问题的,以及- 的遗漏是如何产生影响的,我将不胜感激?
    • 两者都有效,但定义数据的方式会改变访问数据的方式,请在此处阅读更多信息:yaml.org/spec/1.2/spec.html
    【解决方案2】:

    我已经接受marcanuyanswer,这里我只是根据他的回答记录我使用的内容;

    {% for item in page.social %}  # OUTPUT for 1st item
        {{ item[0] }}              # twitter:
        {{ item[1].url }}          # https://twitter.com
        {{ item[1].user }}         # foo
        {{ item[1].show }}         # true
      {% endfor %}   
    

    另外,前面的声明有点改变。与上述代码一起使用的是:

    social:
      twitter :
         url : "https://twitter.com"
         user : "foo"
         show : true
      instagram : 
         url : "https://instagram.com"
         user : "bar"
         show : false
    
    • 请注意缺少的- 破折号。虽然这两种方法都是正确的,但我需要详细了解如何访问这两种方法。
    • http://yaml.org/spec/1.2/spec.html 所述,缩进和- 很重要。比之前有更多空格的每个项目都将自己作为之前的子项。

    【讨论】:

    • 太棒了!谢谢你;)
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多