【问题标题】:How do I filter JSON using jq based on if an attribute value is in an array?如何根据属性值是否在数组中使用 jq 过滤 JSON?
【发布时间】:2019-04-17 20:44:42
【问题描述】:

我有一些 JSON 需要根据数组中是否存在某些属性值进行过滤。

我有一些有用的东西,但感觉就像一个杂物。有没有更简洁的方法?

输入

{"potato":4}

过滤器

select(.potato as $k | ([1,2,3,4] | any(. == $k)))

输出

{
  "potato": 4
}

jqplay 链接 https://jqplay.org/s/Ts97jkk21K

【问题讨论】:

    标签: json filtering jq


    【解决方案1】:

    这似乎不那么杂乱无章了吗?

    [1,2,3,4] as $acceptable
    | .potato as $k
    | select( any($acceptable[];  . == $k) )
    

    如果你的 jq 有IN/1,你可以跳过$k

    [1,2,3,4] as $acceptable
    | select(.potato | IN($acceptable[]))
    

    例如,这种样式可以很容易地将$acceptable 作为命令行参数传入。

    诱惑

    很容易被仅选择解决方案的简单性所吸引,例如:

    [1,2,3,4] as $acceptable
    | select($acceptable[] == .potato)
    

    这在某些情况下会很好,例如如果$acceptable 很短并且不包含重复项(假设我们想要any 的语义)。但是anyIN 具有可能需要的短路语义,例如为了效率。

    【讨论】:

    • 我认为中间的解决方案对我来说似乎是最好的,将 .potato 分配给一个变量是我感觉最差的一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2016-11-02
    • 2014-12-29
    相关资源
    最近更新 更多