编辑json对象中某些字段的更好方法是什么?

时间:2017-08-15 00:00:20

标签: javascript json redux

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

expFormErrors: { 
    position: false, 
    company: false, 
    dateStart: false, 
    dateEnd: false
}

我有一个应该验证的输入字段。 我的验证功能如下。非常简单。

function validateText(text, fieldError, fieldInStringFormat) {
    let minLength = 3;
    let maxLength = 30;
    let hasError = false;
    if(text.length < minLength || text.length > maxLength) {
        hasError = true;
    } else hasError = false;
    return {
        type: VALIDATE_TEXT,
        payload: { field: fieldInStringFormat, fieldError: hasError }
}

好的,所以它基本上调度了一个redux商店更新。在reducer中我有一个switch语句,它根据放入fieldInStringFormat参数的内容更新状态。这样做对我来说,大量的代码来完成一些简单的事情......这里是它在减速器中的样子。

switch(action.fieldInStringFormat){
case 'position':
    return {
        ...state,
        expFormError: action.payload.fieldError,
        expFormErrors: { 
            ...state.expFormErrors, 
            position: action.payload.fieldError }
        };
case 'company': 
    return {
        ...state,
        expFormError: action.payload.fieldError,
        expFormErrors: { 
            ...state.expFormErrors, 
            company: action.payload.fieldError 
        }
};
}

正如您所看到的,这是一大堆重复的代码,我认为这是没有人想要的。 &#39;永远不要重复自己&#39;假设我有一个包含100个字段的对象,输入所有这些都是荒谬的。

有更好的方法吗?我尝试查找各种​​JSON引用,但无法找到任何内置的方法。

我想象的解决方案是这样的:

return {
    ...state,
    expFormErrors: { 
        ...state.expFormErrors,
        [someParameterStringWhichWouldEqualTheWantedField]: action.payload.fieldError

1 个答案:

答案 0 :(得分:3)

您想要的术语是computed property keys。他们将完全满足您的需求:

return {
  ...state,
  expFormErrors: {
    ...state.expFormErrors,
    [action.fieldInStringFormat]: action.payload.fieldError
  }
};