Arrays 使用jq向json中的元素数组添加元素
好吧,我花了很多时间在这上面。 使用jq,我想测试数组中是否存在一个元素,如果是,则能够moffify该元素,如果不将该元素添加到该数组中 我读过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个元素
{
“登录”:“用户”,
“副本”:[
{
“链列表”:“链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