Karate - Jak używać zagnieżdżonych dla każdego w karate podobnie do javascript

Nov 27 2020

Chcę przejrzeć poniżej zagnieżdżoną strukturę json i chcę zaktualizować wszystkie wymagane pola, jednak mogłem to osiągnąć za pomocą skryptu, ale chcę to zrobić w karate JS, nie widzę żadnych przykładów zagnieżdżania dla każdej pracy.

Chcę zaktualizować dane 26 okresów (tutaj dla czytelności użyłem 3), na podstawie indeksu Chcę zaktualizować pole okresu, tj. Jeśli (klucz indeks ==), te 26 okresów znajduje się pod każdym atrybutem samochodu. (UWAGA: ponownie masz wiele samochodów i wiele atrybutów samochodu, a każdy atrybut samochodu masz 26 okresów)

Nie mogę użyć tego Karate - Dopasuj dwie dynamiczne odpowiedzi tylko wtedy, gdy masz jedną listę tablic i masz mniej danych

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

Wpisz kod skryptu


//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;
              }
            });
          }
        });
      });
    });

Odpowiedzi

1 PeterThomas Nov 27 2020 at 10:47

Nie myśl o tym jako o aktualizacji, ale jako o transformacji. Nie używam twojego przykładu, ponieważ jest on niekoniecznie skomplikowany. Oto prostszy przykład, który zawiera wszystkie potrzebne koncepcje:

* 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

Które wydruki:

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

Jeśli to nie zadziała, poszukaj innego narzędzia. Karate jest przeznaczone do testowania i asercji, a nie do robienia tego, co zwykle robisz w językach programowania. Podejrzewam, że wpadłeś w pułapkę pisania „zbyt inteligentnych testów”, więc przeczytaj to:https://stackoverflow.com/a/54126724/143475