Вложенная фильтрация с помощью jq

Да, это запрещено. Вы не первый, кто придумал эту совершенно логичную идею. По-моему, это один из очевидных «ошибок» / «упущений» в спецификации указателей на членов на C ++, но, по-видимому, комитет не заинтересован в дальнейшем развитии спецификации указателей на членов ( в случае с большинством «низкоуровневых» языковых функций).

Обратите внимание, что все необходимое для реализации функции уже существует на этом языке. Указатель на элемент a-data-of-a-member ничем не отличается от указателя на непосредственный элемент данных. Единственное, чего не хватает, это синтаксис для инициализации такого указателя. Однако комитет, по-видимому, не заинтересован в введении такого синтаксиса.

С чистой формальной логической точки зрения это должно было быть разрешено в C ++

struct Inner {
  int i;
  int j[10];
};

struct Outer {
  int i;
  int j[10];
  Inner inner;
};

Outer o;
int Outer::*p;

p = &Outer::i; // OK
o.*p = 0; // sets `o.i` to 0

p = &Outer::inner.i; // ERROR, but should have been supported
o.*p = 0; // sets `o.inner.i` to 0

p = &Outer::j[0]; // ERROR, but should have been supported
o.*p = 0; // sets `o.j[0]` to 0
// This could have been used to implement something akin to "array type decay" 
// for member pointers

p = &Outer::j[3]; // ERROR, but should have been supported
o.*p = 0; // sets `o.j[3]` to 0

p = &Outer::inner.j[5]; // ERROR, but should have been supported
o.*p = 0; // sets `o.inner.j[5]` to 0

. Типичная реализация элемента-указателя-данных - это не что иное, как просто байт-смещение члена от начала окружающего объекта. Поскольку все члены (непосредственные члены и члены членов) в конечном итоге последовательно выкладываются в памяти, члены членов также могут быть идентифицированы с помощью определенного значения смещения. Это то, что я имею в виду, когда говорю, что внутренняя работа этой функции уже полностью реализована, все, что необходимо, - это синтаксис инициализации.

На языке C эта функция эмулируется явными смещениями, полученными с помощью стандартного offsetof макрос. А в C я могу получить offsetof(Outer, inner.i) и offsetof(Outer, j[2]). К сожалению, эта возможность не отражается в C ++ указателях на данные.

0
задан peak 21 January 2019 в 23:59
поделиться

1 ответ

Все, что вам нужно сделать, это добавить вызов select в функцию карты, например, так:

jq 'map(select(.website_ids.item[] | contains("4")))'

После редактирования это немного сложнее, но его можно обойти, проверив тип .website_ids.item и затем основанный на этом типе, выполняющий проверку содержимого или простую проверку на равенство:

map((select((.website_ids.item | type) == "array") | select(.website_ids.item[] | contains("4"))), (select((.website_ids.item | type) == "string") | select (.website_ids.item == "4")))

Здесь он отформатирован немного более читабельно:

map(
    (select((.website_ids.item | type) == "array") | select(.website_ids.item[] | contains("4"))),
    (select((.website_ids.item | type) == "string") | select (.website_ids.item == "4"))
)
0
ответ дан Marcus 21 January 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: