Непоследовательное поведение для jq в / 1 - PullRequest
0 голосов
/ 01 мая 2019

Следующий пример из jq документов работал как положено -

$ echo '[1,2]' | jq 'map(in([0,1]))'
[
  true,
  false
]

но преобразование значений в строки не удалось -

$ echo '["1", "2"]' | jq 'map(in(["0","1"]))'
jq: error (at <stdin>:1): Cannot check whether array has a string key

Чтобы убедиться, что это не проблема с кавычками, я также попробовал -

$ echo "[\"1\", \"2\"]" | jq 'map(in(["0","1"]))'
jq: error (at <stdin>:1): Cannot check whether array has a string key

В дополнение к этому следующий фрагмент также не работает, что, вероятно, связано с приведением 0 к логическому значению false -

$ echo '[0,1]' | jq 'map(in([1,2]))'       
[
  true,
  true
]

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Вы не понимаете, что делает in/1.Это не проверка, является ли значение членом массива, а скорее, является ли значение членом ключей объекта.Таким образом, для массивов ожидаются числа (индексы) или для объектов - строки (ключи).Это точно так же, как has/1, но входы меняются местами.

$ jq -n '[0,-1,20,9,16,10] | map(in([range(20;30)]))' # 10 item array
[
  true,
  false,
  false,
  true,
  false,
  false
]
$ jq -n '["foo","bar"] | map(in({foo:1,boo:2,bat:3}))'
[
  true,
  false
]

Если вы хотите проверить членство в массиве, встроенного элемента нет, но вы можете создать его самостоятельно.Хотя contains/1 близко, но не совсем, так как он проверяет, являются ли строки подстроками и не равны.any/2 может быть использовано для этого.

def has_value($value):
    any(.[]; . == $value);

def in_array($arr): # swapped input version
    . as $value | any($arr[]; . == $value);
1 голос
/ 01 мая 2019

index/1 - это встроенная функция, которую наиболее удобно использовать для проверки принадлежности массива. Хотя это не является строго логическим значением, семантика if и // делает использование удобным, как если бы это было так. Если вы хотите строго булевский тест, просто используйте идиому index(_) != null.

index/1 заслуживает подробного понимания, поэтому рассмотрите возможность изучения руководства jq и FAQ. Обратите внимание, что INDEX/1 не имеет отношения.

...