Javascript 通过分派更改obj的特定值

Javascript 通过分派更改obj的特定值,javascript,reactjs,redux,Javascript,Reactjs,Redux,我想设置我从express validator收到的错误我确实在问题中包含了该数组的图像例如,如果电子邮件中有错误,我想在电子邮件中的errorsInitState上设置它 这是错误初始化状态 export const errorsInitState = { errors: { email: { msg: "" }, password: { msg: "" }, confirmPassword: { msg: ""

我想设置我从express validator收到的错误我确实在问题中包含了该数组的图像例如,如果电子邮件中有错误,我想在电子邮件中的errorsInitState上设置它

这是错误初始化状态

export const errorsInitState = {
  errors: {
    email: {
      msg: ""
    },
    password: {
      msg: ""
    },
    confirmPassword: {
      msg: ""
    }
  }
};
我确实试过这个,但对我不起作用

export const RegisterReducer = (state = errorsInitState, action) => {
  const { type, payload } = action;
  switch (type) {
    case FAILIED_REGISTRATION:
      return {
        ...state,
        errors: {
          ...state.errors,
          errors: payload.map(err =>
            err.param === "email"
              ? { ...err, msg: err.msg }
              : err.param === "password"
              ? { ...err, msg: err.msg }
              : err.param === "confirmPassword"
              ? { ...err, msg: err.msg }
              : ""
          )
        }
      };
  }
};

对于如此数量的ES6 spread构造狂热来说,这不是一个好的用例。请尝试以下方法:

const RegisterReducer=(state=errorsInitState,action)=>{
const{type,payload}=action;
开关(类型){
注册失败的案例:
返回{
错误:{
…陈述错误,
…有效负载.reduce((obj,{param,…rest})=>{
obj[param]={…rest};
返回obj;
}, {})
}
};
}
};
//下面的代码用于演示
var errorsInitState={errors:{email:{msg:},密码:{msg:},confirmPassword:{msg:}};
var注册失败=1;
var errors=[{msg:“需要电子邮件”,param:“电子邮件”},{msg:“请输入一个包含6个或更多字符的密码”,param:“密码”}];

log(RegisterReducer(errorsInitState,{type:failed_registation,payload:errors}))不清楚什么不起作用以及预期的行为是什么。
更改register reducer的值以设置express validator数组中的错误
whh…你能重新表述一下吗?我想设置我从express validator得到的错误,我确实在问题中包含了该数组的图像,例如,如果在我想在emailDeep copy中将其设置为errorsInitState的电子邮件是不需要的,它也容易创建不必要的重新渲染,有损(虽然状态不应该是问题),而且这种技术是已知速度最慢的。一对浅克隆比这要好得多。在我开发前端应用程序的所有岁月中,我从未需要过一个深度克隆。深度克隆是一种代码气味,它表明您未能将数据隔离在可管理的块中。@Emilebergron我承认不熟悉
react
,除此之外,在某种程度上严格禁止您修改
状态。因为asker函数接受state作为参数,所以我假设除了模板中给出的属性之外,其他属性也可能在它上面。在这些情况下,我认为有必要拥有一个深度副本,否则在两个副本之间共享的任何被修改的延迟对象引用也会修改
状态,我认为这是不可接受的。我看到的唯一其他方法是迭代浅复制状态。您有更好的解决方案吗?如果不打算更改状态的其他属性,则不应复制它们,因为React将使用浅层比较来检查它们是否更改。比如说
state.otherThing
没有改变,但是因为你已经深度克隆了状态,现在使用它的组件也将重新呈现。最好的方法是这样:
errors:{…state.errors,…payload.reduce((errors,{param,msg})=>({…errors,[param]:{msg}),{}
@EmileBergeron我已经用你的建议编辑了答案。