Dhamo
Dhamo

Reputation: 1251

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

I have the following JSON response (reference name: "list") and

  [
  {
    "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"
      }
    }
  }
]

also, I have an array list of few key values, evImos = [101,102,104]

In that, I have to identify the first key in the "list" response that has status as "on-voyage". So, the result should be "104".

I have tried the following and I need some help to make it work. Any help would be appreciated.

  * 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))

Upvotes: 1

Views: 1247

Answers (2)

Dhamo
Dhamo

Reputation: 1251

Thanks, to @Peter.

Based on his hint, I just tweaked it a little bit to match my requirement and it worked for me.

Here is the working copy for anyone to refer in the future.

  * 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)

Upvotes: 1

Peter Thomas
Peter Thomas

Reputation: 58153

I'll just give you one hint. This one line will convert the whole thing in to a form that is much easier for you to validate:

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

Which gives you:

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

Now you can do:

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

Also read this: https://stackoverflow.com/a/59162760/143475

Upvotes: 1

Related Questions