Как обновить вложенный объект в избыточном - PullRequest
0 голосов
/ 23 мая 2019

У меня есть объект:

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

Когда я иду, чтобы обновить хранилище редуксов, он заменяет весь год (например, '2000') на новый, который я отправляю в мой редуктор.

Как я могу передать вложенный массив объектов, не заменяя объект всего года?

Мой редуктор в настоящее время выглядит так:

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

Где ...birthdays будетдругой объект в том же формате, что и первый фрагмент кода.

Я также открыт для предложений относительно структуры моих данных, их нормализации и т. д.

Буду признателен за любую помощь.

Ключи объекта в BirthdaysObject неизвестны и назначаются при итерации по отдельному объекту.Я пробовал kolodny / immutability-helper , однако функция $merge возвращает те же результаты, что и мой редуктор.

1 Ответ

1 голос
/ 23 мая 2019

У меня была такая же проблема некоторое время назад. Следуй тому, как я это сделал. У вас есть объект, но я думаю, что у вас должен быть массив объектов. У меня также есть разные имена переменных, но это не должно быть проблемой для понимания логики

        //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
            }
          }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...