将常量或变量的值定义为不带赋值的常量或变量的名称

时间:2016-03-24 20:23:48

标签: javascript ecmascript-6

我有一个非常长的常量文件,看起来像这样:

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; }

5 个答案:

答案 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)

您可以使用以下内容:

  1. 使用所需的字符串创建一个数组。
  2. 使用[].reduce构建一个对象,该对象将这些字符串作为属性名称和值,并将空对象作为初始值传递。 [].forEach也可能有用。
  3. Freeze对象。
  4. 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"等。