使用多个条件过滤对象,包括比较两个对象字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用多个条件过滤对象,包括比较两个对象字段相关的知识,希望对你有一定的参考价值。

有一个JSON对象列表,我试图根据最小值检查和两个字段之间的比较来过滤它们。

{
  "preview": false,
  "init_offset": 0,
  "messages": [],
  "fields": [
    {
      "name": "A"
    },
    {
      "name": "B"
    },
    {
      "name": "Diff"
    },
    {
      "name": "Threshold"
    }
  ],
  "results": [
    {
      "A": "foo",
      "B": "bar",
      "Diff": "1095",
      "Threshold": "1200"
    },
    {
      "A": "baz",
      "B": "bux",
      "Diff": "81793",
      "Threshold": "0"
    },
    {
      "A": "quux",
      "B": "quuz",
      "Diff": "194"
    },
    {
      "A": "moo",
      "B": "goo",
      "Diff": "5000",
      "Threshold": "2000"
    }
 ]
}

我最近来的是

.results
| map(.Threshold //= "0")
| .[]
| select((.Threshold|tonumber > 0) and 
         (.Diff|tonumber > .Threshold|tonumber))

但这给了一个

Cannot index string with string "Threshold"

错误。

基本上我想返回Diff大于非零阈值的所有结果。所以在这种情况下:

{
  "A": "moo",
  "B": "goo",
  "Diff": "5000",
  "Threshold": "2000"
}

使用jq 1.5 FWIW。

答案

你只是错过了一些括号。相比:

select((.Threshold|tonumber) > 0 and
       (.Diff|tonumber) > (.Threshold|tonumber))

或者避免双重转换:

select( (.Threshold|tonumber) as $t
        | $t > 0 and (.Diff|tonumber) > $t )

您还可以简化整个程序:

.results[]
| select( ((.Threshold // 0) | tonumber) as $t 
          | $t > 0 and (.Diff|tonumber) > $t )

以上是关于使用多个条件过滤对象,包括比较两个对象字段的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤复杂对象的列表,以便如果两个具有字段值,我会根据条件删除一个

在单个相关对象上使用多个条件进行过滤[关闭]

Django-create 过滤器基于使用 Q 对象和 if elif 条件的每个字段

通过使用 Map Filter 与对象数组进行比较来返回字段

如何过滤具有多个条件的托管对象实体

通过在嵌套的对象数组中查找多个条件来过滤数组