如何使用 JQ 从相同的 JSON 数组中选择唯一的 JSON 对象

问题描述 投票:0回答:1

以下是输入的 JSON:

{
  "sn": "fdd",
 
  "sc": [
    {
      "pn": "di",
      "pv": {
        "val": "26",
        "com": "="
      },
      "fix": "Hello",
      "tp": "String"
    },
    {
      "pn": "di2",
      "pv": {
        "val": "28",
        "com": "="
      },
      "fix": "Hello2",
      "tp": "String"
    }
  ]
}

下面是我尝试过的 JQ 命令,它生成相同的对象:

def getWhereVal(input):
[input.sc[]] | unique;
def getPreVal(input):
input.sc[].fix;
. as $input | getPreVal($input) as $preVal | getWhereVal($input)

我从上面的 JQ 命令得到以下输出:

[
  {
    "pn": "di",
    "pv": {
      "val": "26",
      "com": "="
    },
    "fix": "Hello",
    "tp": "String"
  },
  {
    "pn": "di2",
    "pv": {
      "val": "28",
      "com": "="
    },
    "fix": "Hello2",
    "tp": "String"
  }
]
[
  {
    "pn": "di",
    "pv": {
      "val": "26",
      "com": "="
    },
    "fix": "Hello",
    "tp": "String"
  },
  {
    "pn": "di2",
    "pv": {
      "val": "28",
      "com": "="
    },
    "fix": "Hello2",
    "tp": "String"
  }
]

我的目标是从一组相同的对象中检索不同的对象,如下所示:

{
    "pn": "di",
    "pv": {
      "val": "26",
      "com": "="
    },
    "fix": "Hello",
    "tp": "String"
  },
  {
    "pn": "di2",
    "pv": {
      "val": "28",
      "com": "="
    },
    "fix": "Hello2",
    "tp": "String"
  }

有人可以帮助我获得所需的输出,我无法使用独特的函数获得结果。

jq
1个回答
0
投票

正如 Inian 的评论所解释的,要获取唯一值,只需运行

.sc | unique
此处示例(或
unique[]
以数组形式获取)。

顺便说一句,如果“唯一”约束基于某个字段,那么您可以运行

.sc | unique_by(.pn)
这里 约束是由
pn

但看来这不是问题。目前还不太清楚你想要什么,因为定义为“输入 JSON”的第一个 JSON 甚至不是一个列表,但你说你有两个列表(两个列表在哪里???)

因此,假设第二个 JSON 作为输入(如果这个假设不成立,则关键概念将是相同的),您可以尝试如下操作:连接列表,然后您可以使用

unique
,如上所述。

只需尝试类似这个示例,其中我使用过

.[0] + .[1] | unique
,但也许您的列表位于某个对象键或其他内容中,然后只需连接所需的列表即可,结果将是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.