【问题标题】:Jekyll / Liquid > Creating JSON > Substitute key value in hash outputJekyll / Liquid > 创建 JSON > 在哈希输出中替换键值
【发布时间】:2015-11-04 10:43:03
【问题描述】:

警告:我不是程序员,我几乎可以肯定我用错了术语。

短:

输出数组时,如何用数据文件数组中某个键的替代值替换数组中特定键的值?

为简洁起见,我将使用简化示例。

我在前面有一个键/值数组的对象。

article:
  name: An article
  date: some date
  author: Tim

我使用 jsonify 标记输出该数组,如下所示:

{{ page.article | jsonify }}

我也有这样的个人数据文件:

Tim
  firstName: Tim
  surname: Bradley
  occupation: coffee consumer

Bob
  firstName: Robert
  surname: De Niro
  occupation: Taxi Driver

我想要做的是输出article 数组,但用数据文件对象中的值(比如 Bradley)替换一个键(作者)的值(Tim)。

我想这个过程可能是这样的: 1.遍历数组 2.定位作者值 3. 将值匹配到对应的数据项 4. 捕获数据项的替换值 5. 将页面数组的键值替换为项目的键值替换 6.输出修改后的数组

我想选择键值属性(“author”=>“value”),而不是它的值(“Tim”),因为实际上值(“Tim”)在对象中重复了几次,我无法选择特定的 - 除非有人知道怎么说选择“作者”之后的第一个 Tim。

我不希望简单地重复数组的值,因为我设想逐个(逐页读取)添加和删除键值。

我该怎么做?

这甚至可以用液体和 jekyll 来完成吗?

这对任何人都有意义吗?

提前感谢您的帮助!

编辑:

我正在通过尝试澄清的方式添加一些 cmets。再次警告,我几乎肯定会混淆我的术语。

我做了一些研究,我输出的是一个作为 json 对象的哈希。

基本上,我希望输出将散列中特定键的值替换为从数据文件生成的相应散列 json。

在查看了可用的过滤器和运算符之后,我认为答案将在于捕获两个哈希集的输出,然后使用替换过滤器将相应数据文件的值替换为原始哈希集中的键值.

如果有人没有击败我,我会在弄清楚后发布答案 - 但我现在还有其他事情要做。

【问题讨论】:

    标签: json jekyll liquid


    【解决方案1】:

    这个答案很老套(不优雅),但它完成了工作,并且在没有提供更清洁的解决方案的情况下,我将其发布在这里。

    问题:我的目标是以 json 格式输出哈希,但用数据文件中的值替换特定值。

    我无法找到一种在输出之前操作数据的方法。相反,我采取了捕获相关字符串输出的过程,然后使用替换过滤器替换值。

    第一步:捕获要替换的值(也可以选择密钥)

    我捕获了我想以 json 格式替换的值。我也手动插入了 json 格式的键,以防散列中其他键的值中存在相同字符串的其他实例:

    {% capture articleAuthorNameValue %}
    "author":"{{ page.article.author }}"
    {% endcapture %}
    

    第二步:捕捉替代值

    自解释但再次记住使用 jsonify 过滤器,因为您要替换以 json 格式表示的值。

    {% capture articleAuthorNameSubstituteValue %}
    {{ site.data.person[page.article.author] | jsonify }}
    {% endcapture %}
    

    第三步:输出和替换

    将值输出为 json 并替换捕获的值。

    {{ page.article | jsonify | replace: articleAuthorNameValue, articleAuthorNameSubstituteValue }}
    

    正如我所暗示的 - 非常丑陋但完成了工作。

    【讨论】:

      【解决方案2】:

      首先,我不确定你的前事是什么

      ---
      article:
        name: An article
        date: some date
        author: Tim
      ---
      

      而不是

      ---
      name: An article
      date: some date
      author: Tim
      ---
      

      我会选择第二种形式,因为它需要更短的表达式来从中获取数据。例如:page.article.authorpage.author

      您的数据文件也没有验证。正确的形式是:

      Tim:
        firstName: Tim
        surname: Bradley
        occupation: coffee consumer
      
      Bob:
        firstName: Robert
        surname: De Niro
        occupation: Taxi Driver
      

      现在,当您想从帖子或页面数据中访问作者的数据时,您不必用作者数据替换作者密钥。您可以从密钥中提取作者数据:

      {% for post in site.posts %}
        <h1>{{ post.title }}</h1>
      
        # creating a new variable containing an author object
        {% assign author = site.data.authors[post.author] %}
      
        # if we have found an author
        {% if author %}
          <p>{{ author.firstName }} {{ author.surname }}</p>
        {% endif %}
      
      {% endfor %}
      

      【讨论】:

      • 感谢您的回复,大卫。您很好地解释了这种方法,当输出是数组中的值时,这很好。我所追求的本质上是一个数组输出过滤器。我将根据您的 cmets 修改我的问题,以使其他人更清楚。再次感谢您。
      【解决方案3】:

      您可以使用自定义 Jekyll 过滤器来做到这一点。

      /_plugins/ 中删除这个replace_keys.rb

      module Jekyll
        module ReplaceKeysFilter
          
          def replace_keys(input, *keys)
            begin
              keys = [] if keys.to_a.empty?
              if input.is_a?(Hash)
                return _replace_keys(input, keys)
              elsif input.is_a?(Jekyll::Drops::DocumentDrop)
                return _replace_keys(input.hash_for_json(), keys)
              else
                "Error: Unhandled class type #{input.class}"
              end
            rescue => e
              "Error: #{e}."
            end
          end
      
          private
      
          def _replace_keys(the_hash, keys)
            i = 0
            until i + 2 > keys.length
              k = keys[i]
              v = keys[i+1]
              the_hash[k] = v if the_hash.key?(k)
              i += 2
            end
            return the_hash
          end
          
      
        end
      end
      
      Liquid::Template.register_filter(Jekyll::ReplaceKeysFilter)
      

      然后使用模板中的过滤器从对象中删除一个或多个键。

      示例用法

      替换post对象的content

      <pre>{{ post | replace_keys: "content", "new content" | pretty_json }}</pre>
      

      替换post对象的contentoutput

      <pre>{{ post | replace_keys: "content", "new content", "output", "new output" | pretty_json }}</pre>
      

      【讨论】:

        猜你喜欢
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-19
        • 2010-12-02
        • 2013-07-21
        • 1970-01-01
        相关资源
        最近更新 更多