2015-12-29 3 views
1

У меня есть JSON так:Как создать инкрементный индекс с JQ

[ 
{"data":"a"}, 
{"data":"b"}, 
{"data":"c"} 
] 

с помощью JQ Я хочу добавить добавочное поле идентификатора так:

[ 
{"data":"a","id":"xx_1"}, 
{"data":"b","id":"xx_2"}, 
{"data":"c","id":"xx_3"} 
] 

я не могу Кажется, он получил правильную команду jq для этого, кто-нибудь?

РЕДАКТИРОВАТЬ мне нужно сделать это с помощью Баш команд

ответ

2

Вот один из способов:

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 не имеет транспонирование/0, это определение JQ можно легко найти, например, by googling.)

+0

Nice !!!! Ты жжешь! :) – hek2mgl

+0

Спасибо! прекрасно работает! – UVRadiation

0
var data=[ 
    {"data":"a"}, 
    {"data":"b"}, 
    {"data":"c"} 
    ]; 
    var cnt=0; 
    data.map(function(data){ 
     data.id="xx_"+cnt; 
     cnt++; 
    }) 

console.log(data); 
+0

Извините, я забыл упомянуть, что мне нужно создать его с помощью bash ... Я отредактирую – UVRadiation

0

Вот два решения. Один использует foreach, который содержит счетчик в состоянии foreach, итерации по входному массиву, возвращающего значения обратно в массив результатов. Это похоже на peakФункция add_id.

[ 
    foreach .[] as $e (
    0 
    ; .+1 
    ; $e + {"id":"xx_\(.)"} 
) 
] 

и один с помощью уменьшения который содержит массив ввода в состоянии уменьшить время прохода по индексам массива, обновление каждого элемента.

reduce range(0,length) as $i (
    . 
    ; .[$i].id = "xx_\($i+1)" 
) 

Я думаю, что уменьшить это проще один для этого случая.

Смежные вопросы