代码之家  ›  专栏  ›  技术社区  ›  Sankalp Singha

合并两个具有内部数组属性的对象,而不改变react中的状态

  •  0
  • Sankalp Singha  · 技术社区  · 7 年前

    我有一个这样的状态对象:

    {
        news: {
            news: [
                {
                    id: 1,
                    name: 'test1'
                },
                {
                    id: 2,
                    name: 'test2'
                },
                {
                    id: 3,
                    name: 'test3'
                }
            ]
        }
        ]
    }
    

    现在,我发出一个Ajax请求,得到的响应如下:

    [
        {
            id: 4,
            name: 'test4'   
        },
        {
            id: 5,
            name: 'test5'   
        },
        {
            id: 6,
            name: 'test6'   
        }
    ]
    

    我不想改变状态,所以在我的Reducer中,如何合并这两个值,以便最终输出如下:

    {
        news: {
            news: [
                {
                    id: 1,
                    name: 'test1'
                },
                {
                    id: 2,
                    name: 'test2'
                },
                {
                    id: 3,
                    name: 'test3'
                },
                {
                    id: 4,
                    name: 'test4'   
                },
                {
                    id: 5,
                    name: 'test5'   
                },
                {
                    id: 6,
                    name: 'test6'   
                }
            ]
        }
        ]
    }
    

    我尝试过类似的方法,但是,它替换了整个新闻对象。

    return { ...state, news: action.payload }
    

    哪里有效载荷在我的回答中有价值。我知道我可能遗漏了一些简单而明显的东西。

    2 回复  |  直到 7 年前
        1
  •  5
  •   adiga    7 年前

    假设 action.payload news ajax返回的数组:

    return { ...state, news: { news: [...state.news.news, ...action.payload] } }
    
        2
  •  0
  •   ehutchllew    7 年前

    这是一个辅助函数,它将为您执行深度克隆,而不考虑其结构:

    function deepClone(obj){
        return Object.keys(obj).reduce((objClone, key) => {
            let newValue;
    
            if(Array.isArray(obj[key]){
                newValue = obj[key].map(item => deepClone(item));
            }
            else if(obj[key] !== null && typeof obj[key] = 'object'){
                newValue = deepclone(obj[key]);
            }
            else{
                newvalue = obj[key];
            }
    
            return {...copyObj, [key]: newvalue};
        }, {});
    }