jq 中的两个 select() 似乎抛出了当前指针
Two select()s in jq seem to throw off current pointer
与JSON:
[
{
"key": "1",
"value": "one"
},
{
"key": "2",
"value": "two"
}
]
和jq
:
.[]|{ one: select(.key=="1").value }
我得到了预期的结果:
{
"one": "one"
}
如果我添加第二个属性,它最终为空:
.[]|{ one: select(.key=="1").value, two: select(.key=="2").value }
如果我将two
属性设置为.
,则显示.
已成为select()
选择的节点:
.[]|{ one: (select(.key=="1").value), two: . }
产生:
{
"one": "one",
"two": {
"key": "1",
"value": "one"
}
}
如何以不影响 .
的方式使用 select()
?或者更好地说,什么是完成我正在寻找的正确方法:
{
"one": "one",
"two": "two"
}
解决方法是:
.|{ one: (.[]|select(.key=="1").value), two: (.[]|select(.key=="2").value) }
数组需要作为一个流发送。使用 .[]|
导致两个单独的流,每个流对应数组的每个元素。
这很清楚:
.[]|{ single: .key }
产生了:
{
"single": "1"
}
{
"single": "2"
}
由于每个流都没有满足两个属性(key=="1"
和 key=="2"
)的标准,因此每个流都被淘汰了。将数组作为一个整体 (.|
) 而不是作为单独的元素 (.[]|
) 发送,允许两个 select()
都按预期运行。
试试这个:
jq 'from_entries as $mapping |
{one:"1", two:"2"} |
map_values($mapping[.])' input.json
这样,您可以更轻松地添加 three
、four
、...
在这种情况下正确的方法是:
from_entries | {one: ."1", two: ."2"}
与JSON:
[
{
"key": "1",
"value": "one"
},
{
"key": "2",
"value": "two"
}
]
和jq
:
.[]|{ one: select(.key=="1").value }
我得到了预期的结果:
{
"one": "one"
}
如果我添加第二个属性,它最终为空:
.[]|{ one: select(.key=="1").value, two: select(.key=="2").value }
如果我将two
属性设置为.
,则显示.
已成为select()
选择的节点:
.[]|{ one: (select(.key=="1").value), two: . }
产生:
{
"one": "one",
"two": {
"key": "1",
"value": "one"
}
}
如何以不影响 .
的方式使用 select()
?或者更好地说,什么是完成我正在寻找的正确方法:
{
"one": "one",
"two": "two"
}
解决方法是:
.|{ one: (.[]|select(.key=="1").value), two: (.[]|select(.key=="2").value) }
数组需要作为一个流发送。使用 .[]|
导致两个单独的流,每个流对应数组的每个元素。
这很清楚:
.[]|{ single: .key }
产生了:
{
"single": "1"
}
{
"single": "2"
}
由于每个流都没有满足两个属性(key=="1"
和 key=="2"
)的标准,因此每个流都被淘汰了。将数组作为一个整体 (.|
) 而不是作为单独的元素 (.[]|
) 发送,允许两个 select()
都按预期运行。
试试这个:
jq 'from_entries as $mapping |
{one:"1", two:"2"} |
map_values($mapping[.])' input.json
这样,您可以更轻松地添加 three
、four
、...
在这种情况下正确的方法是:
from_entries | {one: ."1", two: ."2"}