Reactjs 使用对象rest删除嵌套对象

Reactjs 使用对象rest删除嵌套对象,reactjs,ecmascript-6,redux,ecmascript-next,Reactjs,Ecmascript 6,Redux,Ecmascript Next,我有一个react应用程序,其中包含一些redux状态,如下所示: { shape1: { constraints: { constraint1: { key: value }, constraint2: { key: value } } }, shape2: {

我有一个react应用程序,其中包含一些redux状态,如下所示:

{
    shape1: {
        constraints: {
            constraint1: {
                key: value
            },
            constraint2: {
                key: value
            }
        }
    }, 
    shape2: {
        constraints: {
            constraint1: {
                key: value
            },
            constraint2: {
                key: value
            }
        }            
    }
}
我分派了一个动作,并希望删除其中一个约束对象,即shape1的constraint1。下面是此操作的减速器的外观,假设我正在尝试从shape1中删除constraint1:

case DELETE_CONSTRAINT:
    shape = action.payload;    // ie. shape1, the parent of the constraint I 
                               // am trying to delete
    let {
        [shape]: {'constraints': 
            {'constraint1': deletedItem}
        }, ...newState  
    } = state;
    return newState;
这将从状态中删除整个shape1对象,而不仅仅是单个constraint1对象。我哪里出了问题/这样做的最佳方法是什么?为了与代码的其余部分保持一致,我更喜欢使用对象rest


谢谢

简而言之,不使用对象-不使用spread操作符

但是,您可以通过其他方式进行操作,而无需改变您的状态,例如过滤器,例如:

return state.filter((element, key) => key !== action.payload);
一致性旁注
作为旁注——方法和风格的一致性与实际代码的一致性之间存在巨大差异。如果换一种方式更合乎逻辑,那么就不要觉得有必要为一致性而吹嘘。如果它真的破坏了其他开发人员正在开发的应用程序的一致性,请记录它的不同之处

当在分解结构中使用rest语法来获取对象的一部分时,您将在相同的“级别”上获取其他所有内容

在这种情况下,newState接受一切,而不是
[shape]

由于您的状态有多个嵌套级别,因此必须使用destructuring和rest语法提取新约束,然后创建一个新状态

const state={
形状1:{
限制条件:{
约束1:{
关键字:“值”
},
约束2:{
关键字:“值”
}
}
}, 
形状2:{
限制条件:{
约束1:{
关键字:“值”
},
约束2:{
关键字:“值”
}
}            
}
};
常量形状='shape1';
const constraint='constraint1';
//提取约束
常数{
[形状]:{
限制条件:{
[约束]:删除,
…限制条件
}  
}
}=国家;
//创建下一个状态
常数newState={
……国家,
[形状]:{
…state[shape],//如果shape只包含约束,则继续跳过此操作
约束条件
}
}
console.log(newState)
let {
    [shape]: {'constraints': 
        {'constraint1': deletedItem}
    }, ...newState  
} = state;