Ramda.js(およびレンズ)を使用して、以下のJavaScriptオブジェクトを変更して、そのオブジェクトの「NAME:VERSION1」を「NAME:VERSION2」に変更します。 ID = "/ 1/B/i"である。Ramda js:ネストされたオブジェクトの配列を持つネストされたオブジェクトのレンズ
深く入れ子になった値を変更するだけで、それ以外の場合は構造全体を変更せずに保持したいので、レンズを使用したいと思います。
配列がどのような順序になるのかわからないので、lensIndexを使用したくないので、その代わりに、 "id"フィールドを探してオブジェクトを配列内で見つけたいと思っています。
私はレンズでこれを行うことができますか、それとも別の方法で行う必要がありますか?
const updateDockerImageName =
R.over(R.lensProp('groups'),
R.map(R.over(R.lensProp('apps'),
R.map(R.when(R.propEq('id', '/1/B/i'),
R.over(R.lensPath(['container', 'docker', 'image']),
R.replace(/^NAME:VERSION1$/, 'NAME:VERSION2')))))));
これはもちろん、小さな機能に分解することができます
{
"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": {}
}
}
}
]
}
]
}
これは本当に分かりやすく、簡単に構成および/または変更できます。ありがとうございました! '関数lensMatching(predは){ リターンR.lens( R.find(predが)、 (newValに、アレイ、その他)=> { CONSTインデックス= R.findIndex:lensMatchingため、それを置き換えることができます(pred、array); return R.更新(インデックス、newVal、配列); } ) } これは、レンズのドキュメントに関連するのが少し簡単です。しかし、私は何かを逃していますか? –
@GregEdwardsでもうまくいくはずです。私が他の実装を提案した主な理由は、配列を2回スキャンしないようにすることでした( 'find'と' findIndex'で一度)。しかし、配列がかなり小さければ、問題ではありません。 –
解決策、@ScottChristopherありがとう:)私はまったく新しいramdaと関数型プログラミングですが、これはramdaの機能が欠けていませんか? - プロパティ値でレンズを一致させるには?私はそれがかなり一般的なシナリオであると仮定し、最後の作成関数を次のような配列として直接書くことができます: 'const imageLens = R.lensPath(['groups'、{id: '/ 1/ – aweibell