如何使用 jq 创建增量索引
How do I create an incremental index with jq
我有一个这样的 json :
[
{"data":"a"},
{"data":"b"},
{"data":"c"}
]
使用 jq 我想像这样添加一个增量 id 字段:
[
{"data":"a","id":"xx_1"},
{"data":"b","id":"xx_2"},
{"data":"c","id":"xx_3"}
]
我似乎无法获得正确的 jq 命令,有人吗?
var data=[
{"data":"a"},
{"data":"b"},
{"data":"c"}
];
var cnt=0;
data.map(function(data){
data.id="xx_"+cnt;
cnt++;
})
console.log(data);
这是一种方法:
to_entries | map( (.value.id = "xx_\(1+.key)" ) | .value)
这是另一种方法,但是需要 jq 1.5:
def add_id(prefix):
[ foreach .[] as $o (0;
. + 1;
$o + {"id": (prefix + tostring) }) ];
add_id("xx_")
示例:
$ jq -c -f add_id.jq
[ {"data":"a"}, {"data":"b"}, {"data":"c"} ]
输出:
[{"data":"a","id":"xx_1"},{"data":"b","id":"xx_2"},{"data":"c","id":"xx_3"}]
第三种方法是使用 transpose
:
def add_id(prefix):
[ ., [ range(0;length) | {"id": (prefix + tostring) } ] ]
| transpose | map(add);
(如果您的 jq 没有 transpose/0,可以很容易地找到它的 jq 定义,例如通过谷歌搜索。)
这里有两种解决方法。一个使用 foreach,它在 foreach 状态下保存一个计数器,同时遍历输入数组,将值收集回结果数组。这类似于 peak 的 add_id 函数。
[
foreach .[] as $e (
0
; .+1
; $e + {"id":"xx_\(.)"}
)
]
还有一个使用 reduce,它将输入数组保持在 reduce 状态,同时遍历数组索引,更新每个元素。
reduce range(0,length) as $i (
.
; .[$i].id = "xx_\($i+1)"
)
我认为 reduce 对于这种情况更简单。
我有一个这样的 json :
[
{"data":"a"},
{"data":"b"},
{"data":"c"}
]
使用 jq 我想像这样添加一个增量 id 字段:
[
{"data":"a","id":"xx_1"},
{"data":"b","id":"xx_2"},
{"data":"c","id":"xx_3"}
]
我似乎无法获得正确的 jq 命令,有人吗?
var data=[
{"data":"a"},
{"data":"b"},
{"data":"c"}
];
var cnt=0;
data.map(function(data){
data.id="xx_"+cnt;
cnt++;
})
console.log(data);
这是一种方法:
to_entries | map( (.value.id = "xx_\(1+.key)" ) | .value)
这是另一种方法,但是需要 jq 1.5:
def add_id(prefix):
[ foreach .[] as $o (0;
. + 1;
$o + {"id": (prefix + tostring) }) ];
add_id("xx_")
示例:
$ jq -c -f add_id.jq
[ {"data":"a"}, {"data":"b"}, {"data":"c"} ]
输出:
[{"data":"a","id":"xx_1"},{"data":"b","id":"xx_2"},{"data":"c","id":"xx_3"}]
第三种方法是使用 transpose
:
def add_id(prefix):
[ ., [ range(0;length) | {"id": (prefix + tostring) } ] ]
| transpose | map(add);
(如果您的 jq 没有 transpose/0,可以很容易地找到它的 jq 定义,例如通过谷歌搜索。)
这里有两种解决方法。一个使用 foreach,它在 foreach 状态下保存一个计数器,同时遍历输入数组,将值收集回结果数组。这类似于 peak 的 add_id 函数。
[
foreach .[] as $e (
0
; .+1
; $e + {"id":"xx_\(.)"}
)
]
还有一个使用 reduce,它将输入数组保持在 reduce 状态,同时遍历数组索引,更新每个元素。
reduce range(0,length) as $i (
.
; .[$i].id = "xx_\($i+1)"
)
我认为 reduce 对于这种情况更简单。