Return 列表中名字以特定值开头的对象 (jmespath)

Return objects in list that the first name starts with a certain value (jmespath)

我正在尝试过滤此对象列表,并且仅过滤 return firstName 以特定值开头的对象。

[
  {"firstName":"Paul","lastName":"Collins"},
  {"firstName":"Jerry","lastName":"Johnson"},
  {"firstName":"Jody","lastName":"Johnson","occupation":"Occupado","company":"Companio"},
  {"firstName":"Paul","lastName":"Johanson","occupation":"Developer","company":"Developer Co"}
]

我最远的是这个:

([].firstName | [?starts_with(@,'J') == `true`])

哪个 returns:

[
  "Jerry",
  "Jody"
]

但是,我想要 return 符合此条件的整个对象,而不仅仅是 firstName 字段。我想要的输出是:

[
  {"firstName":"Jerry","lastName":"Johnson"},
  {"firstName":"Jody","lastName":"Johnson","occupation":"Occupado","company":"Companio"},
]

我找不到将字符串数组传递给 starts_with 的方法。我可以从 return 中获取值并将它们插入到多个查询中,一个查询带有一堆 "|| firstName == name1 || firstName == name2"。但是我想尝试在一个查询字符串中执行此操作。

有什么想法吗?

使用select( ... )过滤流。通过扩展,您可以使用 map( select( ... ) ) 从数组中删除项目。

map( select( .firstName | startswith("J") ) )

Demo

在 JMESPath 中,如果这就是您要查找的内容,则 filter projection 可以应用于数组的任何 属性,只需在选择数组本身的括号中指定所述属性即可。

所以,属性 不是 [].firstName,而是放在括号内,例如[?firstName == 'Jerry'],会给你一个叫 Jerry 的人的全部对象。

然后您可以使用 start_with():

来应用它
[?starts_with(firstName,'J')]

这将产生预期的结果

[
  {
    "firstName": "Jerry",
    "lastName": "Johnson"
  },
  {
    "firstName": "Jody",
    "lastName": "Johnson",
    "occupation": "Occupado",
    "company": "Companio"
  }
]