我有一个对象列表(总共20个),我需要插入一个新的键-值对,其中包含每个对象的位置编号(值的范围是1到20)。我已经设法把这段代码放在一起,但是我最终复制了数组中的对象,所以我最终得到了大约100个对象,而不是20个对象。
jq "(.data.items, .data.primaryItemResultList.items)| values | length as $l | values[] += {ranking: range(1, $l)}| .[]"
当我试图将一个静态值添加到“排名”中时,它工作正常,但是如果我使用range函数,它不会产生前面提到的所需输出。
以下是缩短代码的示例:
{
"data": {
"items": [
{
"id": "items_10244-20964274",
"size": "80 ct",
"productId": "20964274",
"brandName": "peets",
"brandId": "25555",
"retailer": {
"isUltrafast": false,
"__typename": "RetailersRetailer"
},
},
{
"id": "items_10244-17284948",
"size": "75 ct",
"productId": "17284948",
"legacyId": "2991007854",
"brandName": "peet's",
"brandId": "50954",
"retailer": {
"isUltrafast": false,
"__typename": "RetailersRetailer"
},
},
{
"id": "items_10244-19232655",
"size": "3 lb",
"productId": "19232655",
"brandName": "kirkland signature",
"brandId": "7632",
"retailer": {
"isUltrafast": false,
"__typename": "RetailersRetailer"
}
]
}
}
有人能帮助解决这个问题并找出错误吗?
预期输出为:
{
"data": {
"items": [
{
"id": "items_10244-20964274",
"size": "80 ct",
"productId": "20964274",
"brandName": "peets",
"brandId": "25555",
"ranking": 1,
"retailer": {
"isUltrafast": false,
"__typename": "RetailersRetailer"
},
},
{
"id": "items_10244-17284948",
"size": "75 ct",
"productId": "17284948",
"legacyId": "2991007854",
"brandName": "peet's",
"brandId": "50954",
"ranking": 2,
"retailer": {
"isUltrafast": false,
"__typename": "RetailersRetailer"
},
},
{
"id": "items_10244-19232655",
"size": "3 lb",
"productId": "19232655",
"brandName": "kirkland signature",
"brandId": "7632",
"ranking": 3,
"retailer": {
"isUltrafast": false,
"__typename": "RetailersRetailer"
}
]
}
1条答案
按热度按时间njthzxwz1#
您可以利用
to_entries
在应用于数组时将使用(从0开始的)项索引作为.key
的情况。添加+1
使其从1开始。Demo
对于基于
range(length)
的方法,我将使用transpose
压缩items数组和indices数组:Demo
输出量:
注意事项:JSON不支持也不识别对象字段的顺序。因此,新的
ranking
字段的实际位置在结构上没有区别。但是,您可以调整jq以改变它为输出生成的文本表示。例如,要将retailer
字段移动到最后一个位置,删除它并使用del(.retailer) + {retailer}
再次添加它(请参见to_entries和range/transpose方法的演示)。但请记住,这种修改只是为了美观。任何JSON后处理程序都可能再次忽略这种顺序。