如何在Redux中更新嵌套对象

时间:2019-05-23 10:58:41

标签: reactjs redux

我有一个对象:

{ //birthdaysObject
    '2000':{
        'January':
         [{
             name: 'Jerry'
         },
         {
             name: 'Chris'
         }]
    },
    '2001':{
        'February':
         [{
             name: 'John'
         }]
    }

当我去更新redux存储时,它用我发送给我的reducer的新对象替换了整个年份(例如'2000')对象。

如何在不替换整个年份对象的情况下推送嵌套的对象数组?

我的减速器目前看起来像:

    return Object.assign({}, state, {
        ...state,
        birthdays: Object.assign({}, state.birthdays, {
            ...state.birthdays,
            ...birthdays
        })
    });

...birthdays是另一个对象,其格式与第一个代码段相同。

我也乐于接受有关数据结构,规范化等方面的建议。

任何帮助将不胜感激。

birthdaysObject中的对象键是未知的,并在遍历单独的对象时分配。我已经尝试过kolodny/immutability-helper,但是$merge函数返回的结果与我的reducer已经执行的结果相同。

1 个答案:

答案 0 :(得分:1)

前段时间我遇到了同样的问题。 按照我做的方式。 您有一个对象,但我认为您应该有一个对象数组。 我在变量上也有不同的名称,但是理解逻辑应该不是问题

        //do a copy of the array first
        let newSubscriptions = state.customer.master.subscriptions.slice();
        
        //for the value you want to change, find it's position in the array first
        const indexInSubscriptions =  newSubscriptions.map(function(item) {
          return item.id;
        }).indexOf( action.id);
        
        //get the child you want to edit and keep it in a new variable
        const under_edit_subscription = state.customer.master.subscriptions[indexInSubscriptions];
        
        //go again over the array and where is the value at the index find above, replace the value
        newSubscriptions = newSubscriptions.map((item, i) => 
                    i === indexInSubscriptions ? under_edit_subscription : item
                   )

        //add the whole array into the state
        return {
          ...state,
          customer: {
            ...state.customer,
            master: {
            ...state.customer.master,
            subscriptions : newSubscriptions
            }
          }
        }