使用 jmespath 通过两个参数查找最小值和最大值

find min and max by two parameters with jmespath

我有这样的对象,我需要用 jmespath

评估哪个是 "cheapest"
{
  "wines": [
    {
      "name": "b",
      "price1": 30,
      "price2": 110
    },
    {
      "name": "a",
      "price1": 50,
      "price2": 1
    },
    {
      "name": "c",
      "price1": 40,
      "price2": 1130
    }
  ]
}

输出应该是:'a'对象

我在做:

min_by(wines, &price1, &price2).name
min_by(wines, &price1).name
min_by(wines, sum(&price1, &price2)).name

但运气不好

根据你所说的最便宜的意思,如果你想选择 price1 和 price2 组合的最小值的项目,你可以使用:min_by(wines, &sum([price1,price2])):

$ echo '{
  "wines": [
    {
      "name": "b",
      "price1": 30,
      "price2": 110
    },
    {
      "name": "a",
      "price1": 50,
      "price2": 1
    },
    {
      "name": "c",
      "price1": 40,
      "price2": 1130
    }
  ]
}' | jp 'min_by(wines, &sum([price1,price2]))'

{
    "price2": 1,
    "price1": 50,
    "name": "a"
}

& 需要位于第二个参数的开头,因为预期类型是表达式引用。 &sum([price1,price2]) 表示对于 wines 数组中的每个项目,计算表达式 sum([price1,price2]) 并使用结果值来确定数组中的哪个项目是最小值。

再举一个例子,如果您想 select 酒单中价格最低的商品 price1price2, 你可以将 sum 替换为 min:

$ echo '{
  "wines": [
    {
      "name": "b",
      "price1": 30,
      "price2": 110
    },
    {
      "name": "a",
      "price1": 50,
      "price2": 1
    },
    {
      "name": "c",
      "price1": 40,
      "price2": 1130
    }
  ]
}' | jp 'min_by(wines, &min([price1,price2]))'

{
    "price2": 1,
    "price1": 50,
    "name": "a"
}