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

这样,您可以更轻松地添加 threefour、...

在这种情况下正确的方法是:

from_entries | {one: ."1", two: ."2"}

Online demo