Динамические/вычисляемые ключи в JMESPath?

Из ES2015 с вычисляемыми свойствами и Array.reduce/Array.map/Object.assign вы можете сделать:

[{name: 'foo', age: 43}, {name: 'bar', age: 55}].map(
    o => ({[o.name]: o.age})).reduce((a, b) => Object.assign(a,b), {})

…и получить:

{ foo: 43, bar: 55 }

Как мне получить это от JMESPath?


Пытаться:

$echo '[{"name": "foo", "age": 43}, {"name": "bar", "age": 55}]' | jp [].{name:age}
[
  {
    "name": 43
  },
  {
    "name": 55
  }
]

person A T    schedule 21.07.2017    source источник


Ответы (2)


Проблема

  • Как построить запрос Jmespath, который возвращает объекты с произвольными парами ключ-значение
  • Ключи должны быть динамическими, основанными на выводе выражения фильтра jmespath.

Обходной путь

  • На момент написания этой статьи (2019-03-22) динамические ключи недоступны в стандартном Jmespath.
  • Однако можно вернуть список списков вместо списка объектов и просто обработать этот список списков вне jmespath.

Пример

 [*].[@.name,@.age]

Возвращает

[['foo', 43], ['bar', 55]]

Который затем может быть обработан вне Jmespath, если это возможно для вас.

Смотрите также

person dreftymac    schedule 23.03.2019
comment
О, это интересно, это на самом деле еще не поддержка? - person A T; 30.03.2019

Чтобы получить именно этот результат: { foo: 43, bar: 55 } , вы должны использовать этот запрос:

@.{foo: @[0].age, bar: @[1].age}

Но, как видите, я не извлекаю ключи foo и bar динамически, потому что не могу сделать это в JMES Path.

person bosskay972    schedule 23.07.2019