2016-07-28 58 views
0

我有以下JSON和想更新使用Immutable.js如何修改一個複雜的JSON對象使用不可變

例如,取決於援助,投標和CID值 提供以下輸入。 援助= A,出價= 1,CID = 4,的NewValue =「四」 如果上述輸入被提供的值「一」需要被改變成「四」

let sampleJson = { 
    Aid: 'A', detail:"sample", list: [ 
    { 
     "Bid": "1", 
     "group": [ 
    { 
     "name": "Group A", 
     "Cid": "4", 
     "value": "One" 
    }, 
    { 
     "name": "Group A", 
     "Cid": "41", 
     "value": "1" 
    }, 
    ] 
}, 
{ 
    "Bid": "2", 
    "group": [ 
    { 
     "name": "Group A", 
     "Cid": "4", 
     "value": "1" 
    }, 
    { 
     "name": "Group A", 
     "Cid": "4", 
     "value": "1" 
    }, 
    ] 
}; 

我能夠訪問值使用下面的代碼。我如何返回具有更新值的整個JSON?

let variale = Immutable.fromJS(sampleJson). 
getIn(['list']). 
find(allocation => allocation.get("Bid") === "1"). 
getIn(['group']). 
find(fun => fun.get("Cid") === "4").set('value',"FOUR"); 

任何人有任何建議如何解決這個問題?

+1

你看過[setIn](https://facebook.github.io/immutable- js/docs /#/ Map/setIn)方法? –

+0

我已經看過setIn方法。當你有一個ImmutableMap時,setIn有效。看起來,當我使用Immutable.fromJS上面的json被轉換爲列表和地圖。那是我掙扎的地方。 – RelexReact

回答

0

我想你可以嘗試這樣做,像這樣:

let immutable = Immutable.fromJS(sampleJson); 
immutable = immutable.setIn(['list', 0, 'group', 0, 'value'], 'FOUR'); 
0

這怪物是我會怎麼做:

const newData = originalData.update('list', list => { 
    const itemIndex = list.findIndex(item => item.get('Bid') === '2'); 

    return list.update(itemIndex, listItem => { 
    return listItem.update('group', groupList => { 
     const groupIndex = list.findIndex(group => group.get('Cid') === '4'); 

     return groupList.update(groupIndex, group => { 
     return group.set('value', 'FOUR'); 
     }); 
    }); 
    }); 
}); 

https://jsbin.com/latupo/7/edit?html,js,console

我個人停止使用不可變的,我總是覺得有點痛苦(更不用說那些文檔了!)。我現在使用redux和好的舊克隆來不改變狀態。在理論上性能較差,但如果你已經沒有什麼東西能夠在幾毫秒內運行,那就省去了麻煩......