【问题标题】:jq add list to object list until conditionjq将列表添加到对象列表直到条件
【发布时间】:2021-07-15 05:32:03
【问题描述】:

背景

我有一个对象,每个值都是一个仅包含字符串的嵌套列表。对于嵌套列表中的每个字符串值,在对象中查找字符串值并将其所有值添加到当前值中。

这是我目前所拥有的:

#!/bin/bash

in=$(jq -n '{
  "bar": [["re", "de"]],
  "do": [["bar","baz"]],
  "baz": [["re"]],
  "re": [["zoo"]]
}')

echo "expected:"
jq -n '{
  "bar": [["re", "de"], ["zoo"]],
  "do": [["bar","baz"], ["re", "de"], ["re"], ["zoo"]],
  "baz": [["re"], ["zoo"]],
  "re": [["zoo"]]
}'

echo "actual:"
echo ${in} | jq '. as $origin 
  | map_values( . + 
    until(
      length == 0;
      (. | flatten | map($origin[.]) | map(select( . != [[]] )) | add ) 
    )
  )'

问题:

输出与输入$in 完全相同。如果从语句中删除 until() 函数,则输出正确地输出一次迭代。虽然我想递归查找对象内的输出字符串并添加查找值,直到查找值为空或不存在。

例如,键 do 的值为 [["bar","baz"]]。如果我们遍历do 的值,我们会遇到baz。对象内baz 的值为[["re"]]。将baz 的值["re"] 添加到do,使得do 等于:[["bar","baz"], ["re"]]。由于re 是对象中的一个键,因此添加["re"] 的值,即["zoo"]。因为["zoo"] 不是对象中的键,所以完成baz 并继续到对象中的下一个键。

【问题讨论】:

    标签: json bash dictionary jq


    【解决方案1】:

    以下解决了最初陈述的问题,但显示的“预期”输出与陈述的问题不完全匹配。

    echo ${in} | jq -c '
      . as $dict
      | map_values(reduce (..|strings) as $v (.;
                           . + $dict[$v] ))
    '
    

    产生(为了清晰起见,经过一些手动重新格式化后):

    {"bar":[["re","de"],["zoo"]],
      "do":[["bar","baz"],["re","de"],["re"]],
     "baz":[["re"],["zoo"]],"re":[["zoo"]]}
    

    如果需要某种递归查找,请重新编写问题陈述,确保避免无限循环。

    【讨论】:

    • 感谢@peak 的回答。需要递归查找,我将更新我的问题陈述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多