如何在Karate的JS函数中将对象/数组追加到另一个对象
Karate JS函数中收集处理后对象的问题解决方法
问题根源
你遇到的问题有两个核心原因:
finalResponse被声明为空对象{},但JavaScript对象没有add()方法,且要存储多个处理后的对象,数组[]才是合适的容器。- 原JS函数无法直接访问外部声明的
finalResponse变量,且函数调用方式不符合Karate语法规范。
修正方案一:重构函数返回处理后的数组
让函数遍历并处理数组元素,最终返回完整结果赋值给finalResponse:
Feature: Append object/array to another object in karate js function Scenario: s1 * def finalResponse = [] * def processItems = """ function(items) { const processed = []; for (let i = 0; i < items.length; i++) { const data = [{'language':'JS'},{'framework':'karate'}]; items[i].optionTranslationListItems = data; processed.push(items[i]); // 用数组push方法追加元素 } return processed; } """ * def jsonReq = """ [ { "id": 1, "optionValue": "value1", "optionCode": "code1", "optionNumber": 1, "status": "ACTIVE" }, { "id": 2, "optionValue": "value2", "optionCode": "code2", "optionNumber": 2, "status": "ACTIVE" } ] """ * finalResponse = call processItems jsonReq * print("finalResponse ", JSON.stringify(finalResponse))
修正方案二:用Karate内置map函数简化代码
Karate提供的karate.map()可以直接遍历数组并处理元素,无需手动编写for循环:
Feature: Append object/array to another object in karate js function Scenario: s1 * def addTranslation = function(item) { item.optionTranslationListItems = [{'language':'JS'},{'framework':'karate'}]; return item; } * def jsonReq = """ [ { "id": 1, "optionValue": "value1", "optionCode": "code1", "optionNumber": 1, "status": "ACTIVE" }, { "id": 2, "optionValue": "value2", "optionCode": "code2", "optionNumber": 2, "status": "ACTIVE" } ] """ * def finalResponse = karate.map(jsonReq, addTranslation) * print("finalResponse ", JSON.stringify(finalResponse))
关键修改点说明
- 容器类型修正:将
finalResponse初始化为数组[],利用数组push()方法实现元素追加。 - 函数调用规范:使用Karate的
call关键字调用自定义函数,或直接用内置karate.map(),替代原代码错误的调用写法。 - 逻辑优化:通过函数返回结果或内置函数处理,避免跨作用域变量访问的问题,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Shreyansh Jain
相关产品推荐
相关产品推荐

