我必须在空手道中将一个 API 响应的特定值存储到两个数组中,其中数组长度可以是偶数或奇数

I have to store a particular value in response of one API into two arrays in karate where array length can be even or odd number

当我尝试使用简单的数组来检查我的逻辑时,它在空手道中运行良好,如下所示;

        const bigArray = [1,2,3,4,5]
        const array1 = []
        const array2 = []
        console.log (bigArray.length)

        for (var i=0; i<bigArray.length; i+=2) {

            array1.push(bigArray[i]);
            if (bigArray[i+1]>0){
                array2.push(bigArray[i+1]);
            }
        }

输出

5
Array 1---------1,3,5
Array 2---------2,4

这正是我想要的,我的大数组是动态的,实际上是 API 中的特定字段。让我们用下面的 API 响应来做到这一点,因为这是主要的 API 在空手道中只调用一次-config.js.

   config.Ids = []
   config.Ids1 = []
   console.log("length of big array-------------" + result.response.value.length)
     for (var i=0; i<result.response.value.length; i+=2)
     {
        config.Ids.push(result.response.value[i].user.id);
        if (result.response.value[i+1].user.id > 0)
        {
            config.Ids1.push(result.response.value[i+1].user.id);
        }
        console.log("value of i-------" + i);
      }

现在,由于数组是动态的,如果数组是偶数,它可以正常工作,但当数组是奇数时,它会出错

数组为偶数时输出

length of big array-------------54

20:53:28.141 [main] INFO  com.intuit.karate - First Array Results:----------[2783, 2792, 2794, 2785, 2755, 2758, 2759, 2761, 2764, 2788, 2789, 2768, 2770, 2772, 2774, 2776, 2907, 2909, 2911, 2913, 2915, 2917, 2919, 2921, 2923, 2925, 2798] 
20:53:28.143 [main] INFO  com.intuit.karate - Second Array Results:----------[2791, 2784, 2793, 2786, 2787, 2757, 2760, 2762, 2765, 2766, 2767, 2769, 2771, 2773, 2775, 2906, 2908, 2910, 2912, 2914, 2916, 2918, 2920, 2922, 2924, 2926, 2756] 

但是当数组为奇数时,我得到一个错误。如何克服这个问题。

<<<<
org.graalvm.polyglot.PolyglotException: Index 53 out of bounds for length 53
- java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
- java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
- java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
- java.base/java.util.Objects.checkIndex(Objects.java:359)
- java.base/java.util.ArrayList.get(ArrayList.java:427)
- com.intuit.karate.graal.JsList.get(JsList.java:60)
- com.oracle.truffle.host.GuestToHostCodeCache.boundaryGet(GuestToHostCodeCache.java:172)

- com.intuit.karate.graal.JsEngine.fromJsEvalException(JsEngine.java:230)
- com.intuit.karate.core.ScenarioEngine.executeJsValue(ScenarioEngine.java:1244)
- com.intuit.karate.core.ScenarioEngine.executeFunction(ScenarioEngine.java:1227)
- com.intuit.karate.core.ScenarioEngine.getOrEvalAsMap(ScenarioEngine.java:1216)
- com.intuit.karate.core.ScenarioRuntime.evalConfigJs(ScenarioRuntime.java:291)
- com.intuit.karate.core.ScenarioRuntime.beforeRun(ScenarioRuntime.java:369)
- com.intuit.karate.core.ScenarioRuntime.run(ScenarioRuntime.java:395)


阅读文档的这一部分。在空手道中使用 for 循环被认为是“不好的做法”:https://github.com/karatelabs/karate#loops

“过滤”有多种方式。使用这些:

* def list = [1, 2, 3, 4]
* def odd1 = list.filter(x => x % 2)
* match odd1 == [1, 3]
* def odd2 = karate.filter(list, function(x){ return x % 2 != 0 })
* match odd2 == [1, 3]
* def even = list.filter((x, i) => i % 2)
* match even == [2, 4]

并使用 forEach() 来处理更一般的情况。就像上面最后一个 filter() 一样,如果你愿意,你可以得到“迭代计数器”,但我把它留给你作为练习。

* def odd = []
* def list = [1, 2, 3, 4]
* list.forEach(x => {if (x % 2) odd.push(x)})
* match odd == [1, 3]