Обновление объекта во вложенном массиве Reaction-Redux - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь обновить объекты, которые находятся во вложенном массиве, ниже приведен пример моего состояния.Я пытаюсь обновить объекты в рамках целей Мне удалось обновить объекты.

НО

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

Объект с индексом 0 также будет обновляться с самым последним обновлением любого объекта.

{
  list: {
    '0': {
      id: 0,
      dueDate: 'By May 28th I Will have: ',
      goals: [
        {
         0: {...}
         1: {...}
         3: {...}
        }
      ]
    }
   '1':{
      id: 0,
      dueDate: 'By June 31st I Will have: ',
      goals: [
        {
         2: {...}
         4: {...}
        }
}

keyName = индекс объекта в списке.(два над '0' и '1': {)

Редуктор

      return {
        ...state,
        [action.payload.keyName]: {
          ...state[action.payload.keyName],
          goals: [
            { ...state[action.payload.keyName].goals, ...action.payload.goal },
            ...state[action.payload.keyName].goals.slice(1, state[action.payload.keyName].goals.length)
          ]
        }
      };

Также, если вы знаете какую-либо хорошую документацию или учебник по нормализаторам, пожалуйста, дайте мне знать.

Заранее спасибо!:)

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Йохан выглядит так, как будто вы неверно трактуете свое состояние.Во-первых, попробуйте обновить ваши цели, используя определение массива goals: [{...state[keyName].goals, ...newGoal}] А также, возможно, этот может пригодиться https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns#updating-nested-objects

0 голосов
/ 24 мая 2019

Это обновит goal на основе его ключей, при условии, что у цели есть уникальные ключи.

const state = {  
    '0': {
      id: 0,
      dueDate: 'By May 28th I Will have: ',
      goals: [        
         {a: 1,
         b: 1,
         c: 1}
      ]
    },
   '1':{
      id: 0,
      dueDate: 'By June 31st I Will have: ',
      goals: [        
         {d: 1,
         r: 1}
      ]
   }
        
};

function reducer(state, keyName = 0, goal) {

 const goals = [...state[keyName].goals];
 const index = state[keyName].goals.findIndex((e) => Object.keys(e).every((key) => Object.keys(goal).includes(key)));
 goals.splice(index,1, goal);
 
 return {
  ...state,
  [keyName]: {
   ...state[keyName],
   goals, 
  }
 };
}

console.log(reducer(state, 0, {a:3, b:2, c:4}));

Предполагается, что вы обновляете свои цели путем позиционирования массива.

const state = {  
    '0': {
      id: 0,
      dueDate: 'By May 28th I Will have: ',
      goals: [        
         {test: 1},
         {test: 1},
         {test: 1}        
      ]
    },
   '1':{
      id: 0,
      dueDate: 'By June 31st I Will have: ',
      goals: [        
         {test: 1},
         {test: 1}
      ]
   }
        
};

function reducer(state, keyName = 0, goal) {
 return {
  ...state,
  [keyName]: {
   ...state[keyName],
   goals: [{...state[keyName].goals, ...goal}]
  }
 };
}

console.log(reducer(state, 0, [{test:3}, {test:44}]));
...