Удаление нескольких объектов из массива состояний Redux - PullRequest
0 голосов
/ 23 января 2019

У меня есть состояние Redux со следующей структурой:

const initialState = {
  data: [
    'device_groups': [
      {
       'id': '1', 'name': 'group 1',
       'devices': [
         {'id': 11, 'name': 'device 11', 'active': 1}, 
         {'id': 12, 'name': 'device 12', 'active': 1},
         {'id': 13, 'name': 'device 13', 'active': 1}
      ]}, 
      {
       'id': '2', 'name': 'group 2',
       'devices': [
         {'id': 21, 'name': 'device 21', 'active': 1}, 
         {'id': 22, 'name': 'device 22', 'active': 0}
       ]}
    ],
   selectedDevices: [
     {'id': 11, 'name': 'device 11', 'active': 1},
     {'id': 12, 'name': 'device 12', 'active': 1},
     {'id': 21, 'name': 'device 21', 'active': 1},
     {'id': 13, 'name': 'device 13', 'active': 1}
   ]
};

В моем компоненте, когда я щелкаю по группе, я хочу удалить все объекты с тем же идентификатором, что и объекты в выбранной группе измассив selectedDevices.В этом случае объекты с идентификаторами 11, 12, 13.

Я пытался сделать это несколькими способами, но, кажется, я всегда остаюсь с одним и тем же массивом.Например, я попробовал это:

const handleClickedGroup = (state, action) => {
  const updatedDevices = [...state.data.device_groups[action.groupIndex].devices].slice();
  let updatedSelectedDevices = [...state.selectedDevices].slice();
  let newSelDevices = [];

  for (let i in updatedDevices) {
    const selectedDeviceIndex = findObjectIndex(updatedSelectedDevices, updatedDevices[i], 'id');
    newSelDevices = [
      ...updatedSelectedDevices.slice(0, selectedDeviceIndex),
      ...updatedSelectedDevices.slice(selectedDeviceIndex + 1)
    ];
  }

  return updateObject(state, {selectedDevices: newSelDevices});
}

Я попробовал еще несколько вещей, но у меня ничего не получалось.Возможно ли это сделать?

ОБНОВЛЕНИЕ

Я думаю, что нашел решение:

const updatedDevices = [...state.data.device_groups[action.groupIndex].devices].slice();
let updatedSelectedDevices = [...state.selectedDevices].slice();
return updateObject(state, {selectedDevices: updatedSelectedDevices.filter(i => !updatedDevices.some(j => j.id === i.id))});

Однако я не уверен, что я 'Я делаю это неизменно.Может кто-нибудь подтвердить это?

1 Ответ

0 голосов
/ 23 января 2019

В конце концов это то, что помогло мне:

const updatedDevices = [...state.data.device_groups[action.groupIndex].devices];
let updatedSelectedDevices = [...state.selectedDevices];
return updateObject(state, {
  selectedDevices: updatedSelectedDevices.filter(i => !updatedDevices.some(j => j.id === i.id))
});
...