【问题标题】:Get last N elements for each item of a JSON object获取 JSON 对象的每个项目的最后 N 个元素
【发布时间】:2020-01-30 13:46:05
【问题描述】:

给定以下 JSON 对象,使用 jq,如何获取每个项目的最后两个元素?

我一直试图在 jqplay.org 的帮助下找到解决方案,但没有得到任何结果。虽然从具有一致键名的对象中获取值相当简单,但我无法理解这一点。

输入:

{
  "foo": {
    "abc": { "key1": "value1" }, 
    "bcd": { "key1": "value1" },
    "cde": { "key1": "value1" },
    "def": { "key1": "value1" }, 
    "efg": { "key1": "value1" },
    "fgh": { "key1": "value1" }
  }, 
  "bar": {
    "ghi": { "key1": "value1" }
  }, 
  "qux": {
    "hij": { "key1": "value1" }, 
    "ijk": { "key1": "value1" },
    "jkl": { "key1": "value1" },
    "klm": { "key1": "value1" }
  }
  /* ... */
}

预期结果:

{
  "foo": {
    "efg": { "key1": "value1" },
    "fgh": { "key1": "value1" }
  }, 
  "bar": {
    "ghi": { "key1": "value1" }
  }, 
  "qux": {
    "jkl": { "key1": "value1" },
    "klm": { "key1": "value1" }
  }
  /* ... */
}

【问题讨论】:

  • 请随意阐述,我很想看看其他方法。

标签: json object key jq


【解决方案1】:

一种选择是使用delpaths 删除除最后一个 N(此处为 2)以外的所有字段。不过,您需要将键名转换为路径表示。例如:

map_values(delpaths(keys_unsorted[:-2] | map([.])))

请参阅jqplay demo

【讨论】:

  • 太棒了!你能解释一下各个部分吗?
  • 你是什么意思各个部分
  • [.] 有什么作用? map ([.]) 是做什么的?等等。如果我错了,请纠正我:[.] 将 obj 转换为数组, map([.]) 将项目转换为数组。例如,从那里,我不明白为什么 keys_unsorted 被管道传输到 map 而不是相反。前面的命令也是如此,一切似乎都是倒退的。谢谢你的帮助:)
  • 参考 jq 手册页,在终端输入man jq
  • man jq 可能不会有帮助。 jq --help 提供了指向在线文档的指针。
【解决方案2】:

简单有效的解决方案:

map_values( to_entries[-2:] | from_entries)

【讨论】:

  • 感谢您的回答。它也有效。与@oguz-ismail 相同的问题,你能解释一下各个部分吗?或者,换句话说,它如何产生所需的输出,除了定义范围的 [-2:] 之外,其余的在我看来就像黑魔法。我宁愿被教如何钓鱼也不愿被给予一条鱼;)
  • 有了 jq 手册,您会发现解决方案的其他三个组成部分很容易,但您可能会发现在管道中添加一个或两个 debug 会有所帮助.
猜你喜欢
  • 2013-04-22
  • 2019-10-19
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多