Javascript 使用Ramda镜头更改对象中的值属性
我想知道如何使用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:
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,
);