Karate: cómo usar anidado para cada uno en karate similar a javascript

Nov 27 2020

Quiero recorrer la estructura json anidada a continuación y actualizar todos los campos obligatorios, sin embargo, podría lograr esto a través de mecanografiado, pero quiero hacer esto en karate JS, no veo ningún ejemplo de cómo anidar para cada trabajo.

Quiero actualizar los datos de 26 períodos (aquí para legibilidad utilicé 3), según el índice Quiero actualizar el campo del período, es decir, si (índice == clave), estos 26 períodos están debajo de cada atributo de automóvil. (NOTA: nuevamente tiene varios automóviles y múltiples atributos de automóvil y cada atributo de automóvil tiene datos de 26 períodos)

No puedo usar este Karate: combine dos respuestas dinámicas solo cuando tenga una lista de matriz única y tenga menos datos

  [
      {
        "cars": [
          {
            "name": "car 1",
            "periodsData": [
              {
                "period": "5ed73ed31a775d1ab0c9fb5c",
                "index": 1
              },
              {
                "period": "5ed73ed31a775d1ab0c9fb5d",
                "index": 2
              },
              {
                "period": "5ed73ed31a775d1ab0c9fb5e",
                "index": 3
              }
            ]
          },
          {
            "name": "car 2",
            "periodsData": [
              {
                "period": "5ed73ed31a775d1ab0c9fb5c",
                "index": 1
              },
              {
                "period": "5ed73ed31a775d1ab0c9fb5d",
                "index": 2
              },
              {
                "period": "5ed73ed31a775d1ab0c9fb5e",
                "index": 3
              }
            ]
          },
          {
            "name": "car 3",
            "periodsData": [
              {
                "period": "5ed73ed31a775d1ab0c9fb5c",
                "index": 1
              },
              {
                "period": "5ed73ed31a775d1ab0c9fb5d",
                "index": 2
              },
              {
                "period": "5ed73ed31a775d1ab0c9fb5e",
                "index": 3
              }
            ]
          }
        ],
        "totalPeriodEprps": [
          {
            "period": "5ed73ed31a775d1ab0c9fb5c",
            "index": 1
          },
          {
            "period": "5ed73ed31a775d1ab0c9fb5d",
            "index": 2
          },
          {
            "period": "5ed73ed31a775d1ab0c9fb5e",
            "index": 3
          }
        ]
       }
     carId ="dfd"
    ]

This above array repeats

Escriba el código del script


//periods is a map of index and values

  async modifyCarsData(mid, id, periods, campaignData) {

//carData is a json file
    carData.forEach(element => {
      element.carId= id;

      // Update all egrp periods
      element.totalPeriodEGRPs.forEach(eGrpPeriod => {
        // egrprd.period =
        if (periods.size === element.totalPeriodEGRPs.length) {
          periods.forEach((value, key) => {
            if (key === eGrpPeriod.index.toString()) {
              eGrpPeriod.period = value;
              return true;
            }
          });
        }
      });

      element.cars.forEach(carCell => {
        

        // Logic for updating periods data
        carCell .periodsData.forEach(periodAttribute => {
          if (periods.size === carCell.periodsData.length) {
            periods.forEach((value, key) => {
              if (key === periodAttribute.index.toString()) {
                periodAttribute.period = value;
                return true;
              }
            });
          }
        });
      });
    });

Respuestas

1 PeterThomas Nov 27 2020 at 10:47

No piense en esto como una actualización, sino como una transformación. No estoy usando su ejemplo porque no es necesariamente complicado. Aquí hay un ejemplo más simple que le brinda todos los conceptos que necesita:

* def data = [{ name: 'one', periods: [{ index: 1, value: 'a' },{ index: 2, value: 'b' }]}, { name: 'two', periods: [{ index: 1, value: 'c' },{ index: 2, value: 'd' }]}]
* def fnPeriod = function(x){ x.value = x.value + x.index; return x }
* def fnData = function(x){ return { name: x.name, periods: karate.map(x.periods, fnPeriod) } }
* def converted = karate.map(data, fnData)
* print converted

Que imprime:

[
  {
    "name": "one",
    "periods": [
      {
        "index": 1,
        "value": "a1"
      },
      {
        "index": 2,
        "value": "b2"
      }
    ]
  },
  {
    "name": "two",
    "periods": [
      {
        "index": 1,
        "value": "c1"
      },
      {
        "index": 2,
        "value": "d2"
      }
    ]
  }
]

Si esto no le funciona, busque otra herramienta. Karate está diseñado para probar y hacer afirmaciones, no para hacer lo que normalmente haces en los lenguajes de programación. Y sospecho que ha caído en la trampa de escribir "pruebas demasiado inteligentes", así que lea esto:https://stackoverflow.com/a/54126724/143475