Обновляйте значения в одном массиве на основе другого в том же файле JSON

#json #jq

Вопрос:

У меня есть файл JSON, подобный этому:

 {
    "download": [0, 0, 0, 0],
    "files": [ "file1.txt", "file1.iso", "file2.txt", "file2.iso" ] 
}
 

Для каждого элемента, files[] заканчивающегося на .txt , я хочу установить соответствующий элемент в download[] на 1 . Как мне это сделать в JQ? Я погуглил, но на самом деле не понимаю синтаксис JQ.

Ответ №1:

В этом случае строительство download с нуля было бы намного проще.

 .download = (.files | map(if endswith(".txt") then 1 else 0 end))
 

Онлайн-демонстрация

Но в заголовке спрашивается, как обновить один массив на основе другого?, и вот один из способов сделать это:

 .download = reduce (.files | path(.[] | select(endswith(".txt")))) as $p (.download; setpath($p; 1))
 

Онлайн-демонстрация

Комментарии:

1. Спасибо, на самом деле я нашел первое решение методом проб и ошибок, но второе очень полезно!