Karate - Wie man verschachtelt für jedes im Karate ähnlich wie Javascript verwendet
Ich möchte die unten stehende verschachtelte JSON-Struktur durchlaufen und alle erforderlichen Felder aktualisieren. Ich könnte dies jedoch durch Typoskript erreichen, möchte dies jedoch in Karate JS tun. Ich sehe keine Beispiele für die Verschachtelung der einzelnen Werke.
Ich möchte 26 Perioden-Daten aktualisieren (hier zur besseren Lesbarkeit habe ich 3 verwendet), basierend auf dem Index. Ich möchte das Periodenfeld aktualisieren, dh wenn (Index == Schlüssel), sind diese 26 Perioden unter jedem Fahrzeugattribut mehrere Autos und mehrere Autoattribute und für jedes Autoattribut haben Sie 26 Periodendaten)
Ich kann dieses Karate nicht verwenden - Passen Sie zwei dynamische Antworten nur an, wenn Sie eine einzelne Array-Liste und weniger Daten haben
[
{
"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
Geben Sie den Skriptcode ein
//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;
}
});
}
});
});
});
Antworten
Betrachten Sie dies nicht als Update, sondern als Transformation. Ich verwende Ihr Beispiel nicht, weil es nicht unbedingt kompliziert ist. Hier ist ein einfacheres Beispiel, das Ihnen alle Konzepte bietet, die Sie benötigen:
* 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
Welche Drucke:
[
{
"name": "one",
"periods": [
{
"index": 1,
"value": "a1"
},
{
"index": 2,
"value": "b2"
}
]
},
{
"name": "two",
"periods": [
{
"index": 1,
"value": "c1"
},
{
"index": 2,
"value": "d2"
}
]
}
]
Wenn dies bei Ihnen nicht funktioniert, suchen Sie bitte nach einem anderen Tool. Karate wurde für Tests und Behauptungen entwickelt und macht nicht das, was Sie normalerweise in Programmiersprachen tun. Und ich vermute, dass Sie in die Falle geraten sind, "Over-Smart-Tests" zu schreiben. Lesen Sie also bitte Folgendes:https://stackoverflow.com/a/54126724/143475