如何在jq中添加索引

时间:2014-07-02 10:01:49

标签: jq

我想使用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
  }
]

但我错过了一些东西。

有什么想法吗?

3 个答案:

答案 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]}