javascript - 如何使用扩展语法 es6 进行简化

标签 javascript object ecmascript-6 spread-syntax

如何简化代码,我尝试生成对象并调用每个更改方法并依赖于参数(newValues)我更改了一些字段,似乎我有重复的代码,如何避免这种情况?我应该使用一些更困难的方法来避免扩展语法

const formName = {
    fieldRange: 'miConfiguration.fieldRange',
    defaultTimeout: 'miConfiguration.doorConfiguration.defaultTimeout',
    standAlone: 'miConfiguration.doorConfiguration.standAlone',
    overrideTimeout: 'miConfiguration.doorConfiguration.overrideTimeout',
    inputMode: 'miConfiguration.doorConfiguration.inputMode',
    stopMi: 'miConfiguration.doorConfiguration.stopMi',
    activeLow: 'miConfiguration.doorConfiguration.activeLow',
    enableDualTechnology: 'miConfiguration.enableDualTechnology',
    passageName: 'miConfiguration.passageName',
}

let {fieldRange, defaultTimeout, standAlone, overrideTimeout, inputMode, stopMi, activeLow, enableDualTechnology, passageName} = formName

let configurationsMi = {
    [passageName]:  null,

    [fieldRange]: null,
    [activeLow]: false,
    [standAlone]: null,
    [defaultTimeout]: null,
    [overrideTimeout]: null,
    [inputMode]: null,
    [stopMi]: null,
    [enableDualTechnology]: false,
}

const defaultValues = {
    [MiConfigurationTypes.AccessPointOnly]: {
        ...configurationsMi,
        [fieldRange]:  MiFieldRanges.Disabled,
    },

    [MiConfigurationTypes.WanderingDetection]: {
        ...configurationsMi,
        [fieldRange]:  MiFieldRanges.Small,
    },
    [MiConfigurationTypes.MuteWanderingDetection]: {
        ...configurationsMi,
        [fieldRange]:  MiFieldRanges.Small,
    },
    [MiConfigurationTypes.LockedWanderingControl]: {
        ...configurationsMi,
        [fieldRange]:  MiFieldRanges.Small,
        [standAlone]:  DoorStates.Locked,
        [defaultTimeout]: '00:00:03',
        [overrideTimeout]: '00:00:30',
        [inputMode]: InputModes.NotUsed,
        [stopMi]: false,
    },
    [MiConfigurationTypes.OpenWanderingControl]: {
        ...configurationsMi,
        [fieldRange]:  MiFieldRanges.Small,
        [standAlone]:  DoorStates.Locked,
        [defaultTimeout]: '00:00:03',
        [overrideTimeout]: '00:00:30',
        [inputMode]: InputModes.NotUsed,
        [stopMi]: false,
    },
}

 onChange={(e, newValue) => {
                console.log(defaultValues)
                Object.keys(defaultValues[newValue]).forEach(key => change(key, defaultValues[newValue][key]))
            }}

最佳答案

您可以将重复部分放入额外的对象文字中 - 就像您已经对 configurationsMi 所做的那样 - 并引用它。

const configurationsWanderingControl = {
    [fieldRange]:  MiFieldRanges.Small,
    [standAlone]:  DoorStates.Locked,
    [defaultTimeout]: '00:00:03',
    [overrideTimeout]: '00:00:30',
    [inputMode]: InputModes.NotUsed,
    [stopMi]: false,
};
const defaultValues = {
    …
    [MiConfigurationTypes.LockedWanderingControl]: {
        ...configurationsMi,
        ...configurationsWanderingControl,
    },
    [MiConfigurationTypes.OpenWanderingControl]: {
        ...configurationsMi,
        ...configurationsWanderingControl,
    },
};

当然,还有避免重复的默认方法:将重复的代码放入函数中(可能带有不同的小细节的参数),然后从多个位置调用它。

关于javascript - 如何使用扩展语法 es6 进行简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47351331/

相关文章:

php - 在 php 中一起创建多个对象时哪个更有效?

javascript - 隐藏/显示点击另一个 div

javascript - 我不明白为什么它不旋转?

javascript - 我不明白在我的代码中使用 push 与使用 unshift 之间的区别

javascript - 没有表单元素的 jQuery AJAX POST?

javascript - 无法发布操作

javascript - 获取具有特定属性的对象列表

java - 移植包括状态的 Java 对象(经过训练的 LIBSVM)

javascript - JS - 实例化后从类返回值

javascript - 比立即调用函数表达式更好的方法来实现这一点?