【问题标题】:Adding Element to array of element in json using jq使用jq将元素添加到json中的元素数组
【发布时间】:2021-08-14 21:31:17
【问题描述】:

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

我读过

这给出了提示但我被卡住了

假设我有一个像这样的 json 文件:

    {
    "LOGIN":"user",
    "COPY": [
        {
            "CHAINLIST":"chain1",
            "ELEMENT": [ "element1-1","element1-2" ] 
        },
        {
            "CHAINLIST":"chain2",
            "ELEMENT": [ "element2-1","element2-2" ] 
        }
    ]
}

我想将元素添加到基于 CHAINLIST id 的 COPY 数组中,比如说这 3 个元素:

//ELEM A
{
       "CHAINLIST":"chain3",
       "ELEMENT": [ "element3-1" ] 
    }
//ELEM B
    {
       "CHAINLIST":"chain2",
       "ELEMENT": [ "element2-1","element2-3" ] 
    }
//ELEM C
    {
       "CHAINLIST":"chain1",
       "ELEMENT": [ "element1-1","element1-2" ] 
    }

ELEM ACHAINLIST id chain3 没有退出 COPY 数组 _> 让我们添加它

ELEM B 已经存在于 COPY 数组中,我想更新 ELEMENT 数组 新值的内容

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

在我的示例中,最终的 json 对象是

    {
    "LOGIN":"user",
    "COPY": [
        {
            "CHAINLIST":"chain1",
            "ELEMENT": [ "element1-1","element1-2" ] 
        },
        {
            "CHAINLIST":"chain2",
            "ELEMENT": [ "element2-1","element2-2","element2-3" ] 
        },
        {
            "CHAINLIST":"chain3",
            "ELEMENT": [ "element3-1"] 
        }
     ]
    }

我正在使用 jq 将元素 Elem 添加到对象 Obj 的过程是:

Elem.CHAINLIST 存在于 Obj.COPY [] 中?

是的:将 Elem.ELEMENT 添加到 Obj.ELEMENT[] 中,对 qvoid 重复项具有唯一性

no : 将 Elem 添加到 Obj.COPY[]

我得到的最好的是

    (if .COPY[]? | select (.CHAINLIST=="chain3") == "" then . else .COPY[.COPY | length ] |= . + { "CHAINLIST":"chain3","ELEMENT":[ "element3-1"]}  end ) 

但是select (.CHAINLIST=="chain3") == "" 什么也没返回,我可以弄清楚如何测试是否为空。

感谢您的宝贵时间!

【问题讨论】:

    标签: arrays json jq


    【解决方案1】:

    以下解决方案使用内置函数INDEX/2 创建方便高效的表示 CHAINLIST-ELEMENT 对象的集合,以及用于组合元素的定制函数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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多