Karaté - Comment utiliser imbriqué pour chacun dans le karaté similaire à javascript

Nov 27 2020

Je veux faire une boucle à travers la structure json imbriquée ci-dessous et je veux mettre à jour tous les champs requis, mais je pourrais y parvenir grâce à un script dactylographié mais je veux le faire dans karaté JS, je ne vois aucun exemple comment imbriquer pour chaque travail.

Je veux mettre à jour les données de 26 périodes (ici pour la lisibilité, j'ai utilisé 3), en fonction de l'index Je veux mettre à jour le champ de période, c'est-à-dire si (index == clé), ces 26 périodes sont sous chaque attribut de voiture. (REMARQUE: vous avez à nouveau plusieurs voitures et plusieurs attributs de voiture et chaque attribut de voiture vous avez 26 périodes de données)

Je ne peux pas utiliser ce Karaté - Faites correspondre deux réponses dynamiques uniquement lorsque vous avez une seule liste de tableaux et que vous avez moins de données

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

Tapez le code de 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;
              }
            });
          }
        });
      });
    });

Réponses

1 PeterThomas Nov 27 2020 at 10:47

Ne considérez pas cela comme une mise à jour, mais comme une transformation. Je n'utilise pas votre exemple car il n'est pas nécessairement compliqué. Voici un exemple plus simple qui vous donne tous les concepts dont vous avez besoin:

* 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

Quelles impressions:

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

Si cela ne fonctionne pas pour vous, veuillez rechercher un autre outil. Le karaté est conçu pour les tests et les affirmations, et non pour faire ce que vous faites normalement dans les langages de programmation. Et je soupçonne que vous êtes tombé dans le piège de l'écriture de "tests trop intelligents", alors lisez ceci:https://stackoverflow.com/a/54126724/143475