Utilizzando Ramda.js (e obiettivi), voglio modificare l'oggetto JavaScript qui sotto per cambiare "NAME: VERSION1" in "NAME: VERSION2" per l'oggetto che ha ID = "/ 1/B/i".Ramda js: obiettivo per oggetti profondamente annidati con matrici annidate di oggetti
Voglio utilizzare un obiettivo perché voglio solo modificare un valore profondamente annidato, ma altrimenti mantenere l'intera struttura invariata.
Non voglio usare lensIndex perché non so mai in quale ordine saranno gli array, quindi, invece, voglio "trovare" l'oggetto in un array cercando i suoi campi "id".
Posso farlo con obiettivi, o dovrei farlo in un modo diverso?
{
"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": {}
}
}
}
]
}
]
}
Questo è veramente facile da capire e può essere facilmente composto e/o modificato. Grazie! Per lensMatching, potrebbe quello essere sostituito da: 'funzione lensMatching (pred) { ritorno R.lens ( R.find (pred), (newVal, matrice, altro) => { index = const R.findIndex (pred, array); return R.aggiornamento (index, newVal, array); } ) } Mi sembra un po 'più facile relazionarmi alla documentazione dell'obiettivo. Ma mi sto perdendo qualcosa? –
@GregEdwards Anche questo dovrebbe funzionare. Il motivo principale per cui ho suggerito l'altra implementazione era di evitare la scansione degli array due volte (una volta in 'find' e una volta in' findIndex'), tuttavia questo non dovrebbe essere un problema se gli array sono ragionevolmente piccoli. –
Grazie per la soluzione, @ScottChristopher :) Sono completamente nuovo per ramda, e la programmazione funzionale a tutti, ma non è questa una funzionalità mancante in ramda? - per far coincidere un obiettivo in base al valore della proprietà? Presumo che sia uno scenario abbastanza comune e preferirei essere in grado di scrivere direttamente la funzione di composizione finale direttamente come una matrice come questa: 'const imageLens = R.lensPath (['groups', {id: '/ 1/B '},' app ', {id:'/1/B/i '},' contenitore ',' finestra mobile ',' immagine ']) ' – aweibell