Karaté - Comment utiliser imbriqué pour chacun dans le karaté similaire à javascript
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
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