空手道 - 根据另一个静态数组从响应中过滤特定的 json 键

Karate - filter a specific json key from response based on another static array

我有以下 JSON 响应(参考名称:“列表”)和

  [
  {
    "key": "101",
    "val": {
      "portCall": {
        "id": 12664978
      },
      "status": "in-port"
    }
  },
  {
    "key": "102",
    "val": {
      "portCall": {
        "id": 12415798
      },
      "status": "in-port"
    }
  },
  {
    "key": "103",
    "val": {
      "status": "on-voyage",
      "voyage": {
        "id": "7kynv-7lq85"
      }
    }
  },
  {
    "key": "104",
    "val": {
      "status": "on-voyage",
      "voyage": {
        "id": "7kynv-2385"
      }
    }
  }
]

此外,我有一个包含几个键值的数组列表,evImos = [101,102,104]

因此,我必须确定“列表”响应中状态为“航行中”的第一个 key。所以,结果应该是“104”。

我已经尝试了以下方法,但需要一些帮助才能使其正常工作。任何帮助将不胜感激。

  * def function getFirst = function(evImos) { for (let num of evImos) { let results = list.filter(d => d["key"] === num && d["val"]["status"] === "on-voyage"); if(results.length === 1) { karate.log(num); return num; } } }
  * list.forEach(getFirst(evImos))

我只给你一个提示。这一行会将整个事情转换成一种更容易验证的形式:

* def temp = {}
* list.forEach(x => temp[x.key] = x.val.status)

这给你:

{
  "101": "in-port",
  "102": "in-port",
  "103": "on-voyage",
  "104": "on-voyage"
}

现在您可以:

* def isOnVoyage = function(key){ return temp[key] == 'on-voyage' }

另请阅读:

感谢@Peter。

根据他的提示,我稍微调整了一下以符合我的要求,它对我有用。

这是工作副本,供以后任何人参考。

  * def temp = {}
  * list.forEach(x => temp[x.key] = x.val.status)
  * def isOnVoyage = function(keys){ for (let key of keys) { if(temp[key] == 'on-voyage'){ karate.log(key); karate.set('num', key); break; }}}
  * isOnVoyage(evImos)