Karate - Jak używać zagnieżdżonych dla każdego w karate podobnie do javascript
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
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