簡體   English   中英

使用Ramda鏡頭更改對象中的值屬性

[英]Change Value Properties in Object with Ramda Lenses

我想知道如何使用Ramda Lenses更改對象屬性。

目前,我有一個很深的狀態:

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_REPLY_ON_BLOCK :
// payload => {text: 'new_text'}, or {value: 'new_value'}, or anyway...

let key = Object.keys(payload)[0];
let value = payload[key];

return R.over(
  R.lensPath(["buckets", 0, "blocks", 0, "messages", 0, "replies", 0, key]),
  R.set(value),
  state
);

我嘗試使用Merge:

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

但結果相同:狀態未被修改,我沒有錯誤。

也許用mergeDeepLeft解決:

//payload => {value: 'new_value'}

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

你很親密 問題是R.setR.over用於兩個不同的任務。 你不需要over這里。 相反,應set外部函數,將第二個參數設置為要將鏡頭設置為的值:

 const payload = {text: 'new_text'} const key = Object.keys(payload)[0]; const value = payload[key]; const state = {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'}]}]}]}]} console.log( R.set( R.lensPath(['buckets', 0, 'blocks', 0, 'messages', 0, 'replies', 0, key]), value, state, ) ) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script> 

你使用over ,當你想基於這樣已經存在,傳遞函數從舊值新值作為第二個參數的值進行調整。 例如, R.over(myLens, R.toUpper, obj)

 const payload = {text: 'new_text'} const key = Object.keys(payload)[0]; const value = payload[key]; const state = {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'}]}]}]}]} console.log( R.over( R.lensPath(['buckets', 0, 'blocks', 0, 'messages', 0, 'replies', 0, key]), R.toUpper, state, ) ) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM