Javascript 使用Ramda镜头更改对象中的值属性

Javascript 使用Ramda镜头更改对象中的值属性,javascript,reactjs,redux,ramda.js,Javascript,Reactjs,Redux,Ramda.js,我想知道如何使用Ramda镜头更改对象属性 目前,我有一个深刻的状态: buckets[ blocks[ messages[ replies [ {id: 0, text: 'text 0', value: 'simple value 0'}, {id: 1, text: 'text 1', value: 'simple value 1'}, {id:

我想知道如何使用Ramda镜头更改对象属性

目前,我有一个深刻的状态:

buckets[
    blocks[
        messages[
            replies [
                {id: 0, text: 'text 0', value: 'simple value 0'},
                {id: 1, text: 'text 1', value: 'simple value 1'},
                {id: 2, text: 'text 2', value: 'simple value 2'},
                ...
            ]
        ]
    ]
]
我有一个基本的有效载荷。我希望获取属性和值,并在我的状态中通过新值设置旧值,例如使用以下有效负载:

{text:'new_text'} 或 {value:'new_value'}

在我的减速机中,我有:

case SEQUENCES.UPDATE\u REPLY\u在\u块上:
//有效负载=>{text:'new_text'},或{value:'new_value'},或无论如何。。。
让key=Object.keys(有效载荷)[0];
让值=有效载荷[键];
返回右上角(
R.lensPath([“桶”,0,“块”,0,“消息”,0,“回复”,0,键],
R.set(值),
状态
);
我尝试了合并:

return R.over(
    R.lensPath(["buckets", 0, "blocks", 0, "messages", 0, "replies", 0),
    R.merge(payload),
    state,
);
但同样的结果是:状态没有被修改,我没有错误

也许可以用左键解决:


你很接近。问题在于和用于两个不同的任务。您不需要在这里查看
。相反,您的外部功能应该是
set
,第二个参数是您要将镜头设置为的值:

const payload={text:'new_text'}
const key=Object.keys(有效载荷)[0];
常量值=有效载荷[键];
const state={bucket:[{blocks:[{messages:[{回复:[{id:0,text:'text 0',value:'simple value 0'},{id:1,text:'text 1',value:'simple value 1'},{id:2,text:'text 2',value:'simple value 2'}]}
console.log(
R.set(
R.lensPath(['buckets',0',blocks',0',messages',0',repress',0,key]),
价值
国家,,
)
)

谢谢@Scott的回答!使用mergeDeepLeft更好?您的
mergeDeepLeft
非常合适,只要您希望包含有效负载中的所有内容。显然,它仍然是更干净的代码,因为您不必提取密钥和值。这里需要了解的重要一点是
set
over
的用途。
//payload => {value: 'new_value'}

return R.over(
    R.lensPath(["buckets", 0, "blocks", 0, "messages", 0, "replies", 0),
    R.mergeDeepLeft(payload),
    state,
);