7

我想使用 jq 映射我的输入

["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
  }
]

但我错过了一些东西。

有任何想法吗?

4

3 回答 3

14

这比你想象的要容易。

to_entries | map({name:.value, index:.key})

to_entries接受一个对象并返回一个键/值对数组。在数组的情况下,它有效地生成索引/值对。您可以将这些对映射到您想要的项目。

于 2014-07-04T07:11:02.440 回答
2

更“动手”的方法是使用reduce ["a", "b"] | . as $in | reduce range(0;length) as $i ([]; . + [{"name": $in[$i], "index": $i}])

于 2014-11-04T18:11:53.957 回答
2

这里还有一些方法。假设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]}
于 2017-08-24T19:03:16.177 回答