繁体   English   中英

Jekyll / Liquid > 创建 JSON > 在哈希输出中替换键值

[英]Jekyll / Liquid > Creating JSON > Substitute key value in hash output

警告:我不是编码员,几乎可以肯定我误用了术语。

短的:

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

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

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

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”)在对象中重复了几次,我不能选择特定的 - 除非有人知道怎么说选择“作者”之后的第一个蒂姆。

我不希望简单地重复数组的值,因为我设想根据具体情况(逐页阅读)添加和删除键值。

我怎样才能做到这一点?

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

这对任何人都有意义吗?

提前感谢您的任何帮助!

编辑:

为了澄清,我添加了一些评论。 再一次,我警告说我几乎肯定会混淆我的术语。

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

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

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

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

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

问题:我的目标是以 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 }}

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

首先,我不确定为什么你的前台问题是

---
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 %}

您可以使用自定义 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM