我有一个非常长的常量文件,看起来像这样:
export const AUTH_REQUEST = 'AUTH_IN_PROGRESS';
export const AUTH_SUCCESS = 'AUTH_SUCCESS';
export const AUTH_FAIL = 'AUTH_FAIL';
export const AUTH_TERMINATE = 'AUTH_TERMINATE';
export const AUTH_REDIRECT = 'AUTH_REDIRECT';
....等等。
是否可以声明变量/ constant / etc.与变量本身具有相同的名称?
或者......是否存在允许这样的数据结构?
const AUTH = {'TERMINATE', 'REDIRECT'}
...等
因此,您AUTH.TERMINATE
的值为TERMINATE
。
我的备份解决方案是执行以下操作:const AUTH = keyObj(['TERMINATE', 'SUCCESS'])
。
该功能看起来像这样:
let keyObj = (vals)=>{
let obj = {};
vals.forEach((v)=>{ obj[v]=v; });
return obj;
}
答案 0 :(得分:2)
您可以编写辅助函数:
function consts() {
return Array.from(arguments).reduce(function(o, c) {
o[c] = c;
return o;
}, {});
}
然后:
var AUTH = consts("TERMINATE", "REDIRECT");
编辑 - 如果您希望它是不可变的,您可以确保以这种方式创建属性:
function consts() {
return Array.from(arguments).reduce(function(o, c) {
Object.defineProperty(o, c, {
value: c, enumerable: true
});
return o;
}, {});
}
答案 1 :(得分:2)
您可以使用以下内容:
[].reduce
构建一个对象,该对象将这些字符串作为属性名称和值,并将空对象作为初始值传递。 [].forEach
也可能有用。var strings = ['a', 'b'],
obj = Object.create(null);
strings.forEach(function(str) {
obj[str] = str;
});
Object.freeze(obj);
在单一陈述中缩小,
Object.freeze(['a','b'].reduce((o,s) => (o[s]=s, o), Object.create(null)));
答案 2 :(得分:1)
是否可以声明变量/ constant / etc.与变量本身具有相同的名称?
如果您处于严格模式(并且可能必须使用const
),我很确定无法动态填充JavaScript命名空间。这实际上是你所要求的,不,对不起。这里的其他答案是动态地向对象添加属性,这是完全正常的。
答案 3 :(得分:1)
这是一个打包的包。 https://www.npmjs.com/package/keymirror
答案 4 :(得分:0)
不确定我是否正确,但有了这个:
const types = ['SUCCESS', 'FAIL', 'TERMINATE'];
const AUTH = {};
for (let type of types) {
AUTH[type] = type;
}
您将获得AUTH.TERMINATE
,其值为字符串"TERMINATE"
等。