从嵌套在对象中的数组中删除对象

时间:2020-04-19 23:00:55

标签: javascript reactjs redux

我开始与redux一起玩,到目前为止我很惊讶。 我现在的问题是,我的新的reducer函数更改了一个状态变量的类型,而我不希望这样做。

状态应具有如下形式: enter image description here

我只想从jsons数组中删除一个对象:

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

我最终得到了这个reducer,它现在以对象而不是数组的形式返回项目状态。

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)
                    ]
            }
        }
    };

到目前为止,我尝试了各种方法,但是在高度嵌套的对象内更改状态似乎仍然像是对redux的折磨。有人知道写的方法吗?

2 个答案:

答案 0 :(得分:1)

使用高度嵌套的对象更改状态可能很困难,但是在这种情况下,mapfilter函数确实很有帮助

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)) 
   };

答案 1 :(得分:0)

我通过使用不可变性助手中的update()解决了这个问题。 非常方便

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]]}
                }
            }
        });