我想使用jq map我的输入
["a", "b"]
输出
[{name: "a", index: 0}, {name: "b", index: 1}]
我到目前为止
0 as $i | def incr: $i = $i + 1; [.[] | {name:., index:incr}]'
输出:
[
{
"name": "a",
"index": 1
},
{
"name": "b",
"index": 1
}
]
但我错过了一些东西。
有什么想法吗?
答案 0 :(得分:4)
这比你想象的容易。
to_entries | map({name:.value, index:.key})
to_entries
获取一个对象并返回一组键/值对。在数组的情况下,它有效地使索引/值对。您可以将这些对映射到您想要的项目。
答案 1 :(得分:1)
更多"实践"方法是使用reduce
:
["a", "b"] | . as $in | reduce range(0;length) as $i ([]; . + [{"name": $in[$i], "index": $i}])
答案 2 :(得分:1)
以下是一些方法。假设input.json
包含您的数据
["a", "b"]
你调用jq作为
jq -M -c -f filter.jq input.json
然后,以下任何filter.jq
过滤器都会生成
{"name":"a","index":0}
{"name":"b","index":1}
1)使用键和 foreach
foreach keys[] as $k (.;.;[$k,.[$k]])
| {name:.[1], index:.[0]}
编辑:我现在意识到foreach E as $X (.; .; R)
形式的过滤器几乎总是被重写为E as $X | R
所以上面的内容实际上就是
keys[] as $k
| [$k, .[$k]]
| {name:.[1], index:.[0]}
可以简化为
keys[] as $k
| {name:.[$k], index:$k}
2)使用键和转置
[keys, .]
| transpose[]
| {name:.[1], index:.[0]}
3)使用函数
def enumerate:
def _enum(i):
if length<1
then empty
else [i, .[0]], (.[1:] | _enum(i+1))
end
;
_enum(0)
;
enumerate
| {name:.[1], index:.[0]}