JQ:选取键的值在一组给定值中的对象

3

我有一个JSON对象数组,我希望从中提取子集,使得.name字段与一组输入字符串匹配。

例如,我想要实现以下目标。

jq -n '["a","b","c","d","e"] | map({name:.,foo:"bar"})' \
  | jq 'map(select(.name=="a" or .name=="c"))'

我想到了以下解决方案,但是我的[...]add的使用似乎缺少一些巧妙之处。

jq -n '["a","b","c","d","e"] | map({name:.,foo:"bar"})' \
  | jq --arg name 'a c' '
      [
        ( $name | split(" ") )[] as $name
        | map( select( .name == $name ) )
        | add
      ]'

此解决方案需要我对输入数组进行多次迭代,而非仅一次。有其他想法可以解决这个问题吗?
2个回答

3
将所有内容移入select条件中。您不需要进行两次独立的jq调用。
$ echo '["a","b","c","d","e"]' | jq --arg names 'a c'
    'map(select(. == ($names | split(" ")[])) | { name: ., foo: "bar" })'
[
  {
    "name": "a",
    "foo": "bar"
  },
  {
    "name": "c",
    "foo": "bar"
  }
]

我使用第一个jq来生成一个对象数组格式的样本输入,我正在解析...你的答案完全正确,只是索引略有不同。map(select(.name==($names|split(" ")[]))) - Jon
我问一下,你能否请解释一下语法元素?我无法理解这个类似于Perl的一系列特殊字符试图实现什么。 <3 - ThorSummoner

2
根据ThorSummoner的观点,这里提供了一个不太像 Perl 的解决方案,它使用--argjsoninside,各注释为一行,并利用 shell 的'特性。
$ echo '["a","b","c","d","e"]' | jq --argjson wanted '["a","c"]' '
  .[]                          # break array into elements
| if ([.]|inside($wanted))     # if element is in wanted
  then {name: ., foo:"bar"}    # generate desired output
  else empty                   # otherwise generate nothing
  end
'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接