如何将对象当前键作为参数传入其值对应的方法?避免重复编写键名
问题解答
好问题!很遗憾,在直接定义对象字面量的时候,没办法自动把当前键名作为参数传给值位置的方法调用——因为对象初始化时,每个键值对的求值过程里并没有内置的方式能拿到当前的键名。比如你写的:
const versions = { VersionOne: { welcomeMessage: this.localization.get(/* 这里没法自动拿到'VersionOne' */) }, VersionTwo: { welcomeMessage: this.localization.get(/* 这里没法自动拿到'VersionTwo' */) } };
这种写法里,方法调用的参数位置没有办法直接引用当前的键名,必须手动传入。不过我们可以用一些技巧来避免重复书写长键名:
方法1:用循环动态生成对象属性
如果你有多个类似的键,可以先把所有键名放在一个数组里,然后通过循环遍历数组来生成对象的属性,这样键名只需要写一次:
// 先定义所有需要的版本键名 const versionKeys = ['VersionOne', 'VersionTwo', 'SuperLongVersionNameThatYouDontWantToRepeat']; // 初始化空对象 const versions = {}; // 遍历键名数组,动态生成每个属性 versionKeys.forEach(key => { versions[key] = { welcomeMessage: this.localization.get(key) }; });
方法2:使用Object.fromEntries简化写法
ES2019+支持的Object.fromEntries可以让我们用更简洁的方式生成对象:
const versionKeys = ['VersionOne', 'VersionTwo', 'SuperLongVersionNameThatYouDontWantToRepeat']; const versions = Object.fromEntries( versionKeys.map(key => [ key, { welcomeMessage: this.localization.get(key) } ]) );
方法3:用工具函数封装逻辑
如果你的版本对象还有其他复杂逻辑,可以写一个工具函数来生成每个版本的配置,这样即使键名重复写一次,后续修改逻辑会更方便:
// 封装生成版本配置的函数 function createVersionConfig(key) { // 这里可以添加更多其他属性的逻辑 return { welcomeMessage: this.localization.get(key), // 比如其他属性: someOtherProp: this.someOtherMethod(key) }; } // 调用时绑定正确的this(如果是在类中,确保this指向当前实例) const versions = { VersionOne: createVersionConfig.call(this, 'VersionOne'), VersionTwo: createVersionConfig.call(this, 'VersionTwo'), SuperLongVersionNameThatYouDontWantToRepeat: createVersionConfig.call(this, 'SuperLongVersionNameThatYouDontWantToRepeat') };
这些方法都能帮你避免重复书写长键名,同时实现你想要的把键名传给方法的需求。
内容的提问来源于stack exchange,提问作者User 5842
相关产品推荐
相关产品推荐

