空手道 - 根据另一个静态数组从响应中过滤特定的 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)
我有以下 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)