【发布时间】: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