Korzystając z Ramda.js (i soczewek), chcę zmodyfikować obiekt JavaScript poniżej, aby zmienić "NAME: VERSION1" na "NAME: VERSION2" dla obiektu, który ma ID = "/ 1/B/i".Ramda js: obiektyw dla obiektów głęboko zagnieżdżonych z zagnieżdżonymi tablicami obiektów
Chcę użyć soczewki, ponieważ chcę po prostu zmienić jedną głęboko zagnieżdżoną wartość, ale w przeciwnym razie zachować całą strukturę bez zmian.
Nie chcę używać lensIndex, ponieważ nigdy nie wiem, w jakiej kolejności są tablice, więc zamiast tego chcę "znaleźć" obiekt w tablicy, szukając jego pól "id".
Czy mogę to zrobić z soczewkami, czy powinienem zrobić to w inny sposób?
{
"id": "/1",
"groups": [
{
"id": "/1/A",
"apps": [
{
"id": "/1/A/i",
"more nested data skipped to simplify the example": {}
}
]
},
{
"id": "/1/B",
"apps": [
{ "id": "/1/B/n", "container": {} },
{
"id": "/1/B/i",
"container": {
"docker": {
"image": "NAME:VERSION1",
"otherStuff": {}
}
}
}
]
}
]
}
Jest to bardzo łatwe do zrozumienia i można je łatwo skomponować i/lub zmodyfikować. Dziękuję Ci! Dla lensMatching, to może być zastąpiony przez: 'lensMatching funkcji (pred) { powrotu R.lens ( R.find (pred) (newval, tablica inne) => { indeksu const = R.findIndex (pred, array); return R.update (index, newVal, array); } ) } ' Wydaje mi się, że łatwiej jest mi odnieść się do dokumentacji obiektywu. Ale czy czegoś brakuje? –
@GregEdwards To też powinno działać. Głównym powodem, dla którego zasugerowałem drugą implementację, było uniemożliwienie dwukrotnego skanowania tablic (raz w 'find' i once in' findIndex'), jednak nie powinno to stanowić problemu, jeśli tablice są stosunkowo małe. –
Dziękuję za rozwiązanie, @ScottChristopher :) Jestem całkowicie nowy w ramdzie i funkcjonalnym programowaniu w ogóle, ale czy nie jest to brakująca funkcja w ramdzie? - aby obiektyw pasował do wartości nieruchomości? Zakładam, że jest to dość powszechny scenariusz i wolałbym móc napisać końcową funkcję komponowania bezpośrednio jako tablicę: 'const imageLens = R.lensPath (['groups', {id: '/ 1/B '},' apps ', {id:'/1/B/i '},' container ',' docker ',' image ']) ' – aweibell