Удалить объект из массива, который вложен в объект - PullRequest
1 голос
/ 20 апреля 2020

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

Состояние должно иметь такую ​​форму: enter image description here

Я хочу удалить только объект из массива jsons:

pseudo:
delete state.items[item_index].jsons[json_to_delete_index]

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

case DELETE_JSON:
    const item_index = state.items.findIndex((url) => url.url_id === action.payload.url_id);
    const json_index = state.items[item_index].jsons.findIndex((json) => json.json_id === action.payload.json_id);
    return {
        ...state,
        items: {
            ...state.items,
            [item_index]: {
                ...state.items[item_index],
                jsons:
                    [
                        ...state.items[item_index].jsons.splice(0, json_index),
                        ...state.items[item_index].jsons.splice(json_index + 1)
                    ]
            }
        }
    };

До сих пор я пробовал разные подходы, но изменение состояний внутри сильно вложенных объектов все еще похоже на пытку с избыточностью. Может кто-нибудь знает способ написать это?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Изменение состояния с вложенными объектами может быть трудным, но функции map и filter действительно полезны в этом случае

const item_index = state.items.findIndex((url) => url.url_id === action.payload.url_id);
const json_index = state.items[item_index].jsons.findIndex((json) => json.json_id === action.payload.json_id);

return { 
   ...state, 
   items: state.items.map((item, index) => (index === item_index ? 
   { ...item, item.jsons.filter((json, i) => (i !== json_index)) } : item)) 
   };
0 голосов
/ 20 апреля 2020

Я решил это с помощью update () от immutability-helpers. Очень удобно

import update from 'immutability-helper';

/* some other code */

case DELETE_JSON:
    const item_index = state.items.findIndex((url) => url.url_id === action.payload.url_id);
    const json_index = state.items[item_index].jsons.findIndex((json) => json.json_id === action.payload.json_id);
    return update(state, {
            items: {
                [item_index]: {
                    jsons: {$splice: [[json_index]]}
                }
            }
        });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...