Arrays 使用jq向json中的元素数组添加元素

Arrays 使用jq向json中的元素数组添加元素,arrays,json,jq,Arrays,Json,Jq,好吧,我花了很多时间在这上面。 使用jq,我想测试数组中是否存在一个元素,如果是,则能够moffify该元素,如果不将该元素添加到该数组中 我读过 这给了我一些提示,但我被卡住了 假设我有一个json文件,如: { “登录”:“用户”, “副本”:[ { “链列表”:“链1”, “元素”:[“元素1-1”、“元素1-2”] }, { “链列表”:“链2”, “元素”:[“元素2-1”、“元素2-2”] } ] } 我想将元素添加到基于CHAINLIST id的复制数组中,假设这3个元素

好吧,我花了很多时间在这上面。 使用jq,我想测试数组中是否存在一个元素,如果是,则能够moffify该元素,如果不将该元素添加到该数组中

我读过

这给了我一些提示,但我被卡住了

假设我有一个json文件,如:

{
“登录”:“用户”,
“副本”:[
{
“链列表”:“链1”,
“元素”:[“元素1-1”、“元素1-2”]
},
{
“链列表”:“链2”,
“元素”:[“元素2-1”、“元素2-2”]
}
]
}
我想将元素添加到基于CHAINLIST id的复制数组中,假设这3个元素:

//元素A
{
“链列表”:“链3”,
“元素”:[“元素3-1”]
}
//元素B
{
“链列表”:“链2”,
“元素”:[“元素2-1”、“元素2-3”]
}
//元素C
{
“链列表”:“链1”,
“元素”:[“元素1-1”、“元素1-2”]
}
元素A具有链列表id CHAINE3,该id不存在于复制数组中。\u>

元素B已存在于副本中,我想更新元素数组 满足于新的价值观

元素C已经存在并且是最新的,我不需要做任何事情

在我的示例中,最后一个json对象是

{
“登录”:“用户”,
“副本”:[
{
“链列表”:“链1”,
“元素”:[“元素1-1”、“元素1-2”]
},
{
“链列表”:“链2”,
“元素”:[“元素2-1”、“元素2-2”、“元素2-3”]
},
{
“链列表”:“链3”,
“元素”:[“元素3-1”]
}
]
}
我正在使用jq将元素Elem添加到对象Obj的过程是:

元素链列表是否存在于Obj.COPY[]中

是:将Elem.ELEMENT添加到Obj.ELEMENT[],并具有唯一的qvoid副本

否:将元素添加到对象。复制[]

我得到的最好的结果是

    (if .COPY[]? | select (.CHAINLIST=="chain3") == "" then . else .COPY[.COPY | length ] |= . + { "CHAINLIST":"chain3","ELEMENT":[ "element3-1"]}  end ) 
但是
select(.CHAINLIST==“chain3”)==”
不返回任何内容,我想知道如何测试是否为空


谢谢你抽出时间

以下解决方案使用内置函数
INDEX/2
创建方便高效的表示形式 链表元素对象集合的集合,以及用于组合元素的定制函数,
augment/1

假设定义更新的对象在文件
edits.json
中显示为数组

< input.json jq --argfile edits edits.json '

  # Use `unique` to combine the .ELEMENT fields
  def augment($b):
     reduce ($b|keys_unsorted[]) as $key (.; 
       .[$key].ELEMENT = (.[$key].ELEMENT + $b[$key].ELEMENT | unique));

  (INDEX($edits[];.CHAINLIST) | map_values(del(.CHAINLIST))) as $edits
  | (INDEX(.COPY[]; .CHAINLIST) | map_values(del(.CHAINLIST))) as $COPY
  | .COPY |= ($COPY
              | augment($edits)
              | to_entries
              | map( { CHAINLIST: .key, ELEMENT: .value.ELEMENT} ))
输出:如问题中所述

注意:如果定义更新的对象在文件中显示为一系列对象,则可以将上述解决方案与
--slurpfile
一起使用,而不是使用
--argfile