【问题标题】:Javascript: Using a pre-existent object values as keys os a new oneJavascript:使用预先存在的对象值作为新的键
【发布时间】:2015-03-23 12:58:55
【问题描述】:

我创建了这个对象:

var keys = {A: 'a', B: 'b' };

后来我尝试创建另一个对象:

var values = {keys.A: 1, keys.B: 2};

但是我在 Firefox 控制台中得到了这个:

SyntaxError: missing : after property id

即使我尝试过:

var vals = {keys['A']: 1, keys['B']: 2}

我遇到了同样的错误。

获得成功的唯一方法是输入以下内容:

var vals= {};
vals[keys.A] = 1;
vals[keys.B] = 2;

所以,我的问题是,是否有更优雅的方式(类似于第一次尝试)来创建匿名对象,使用预先存在的对象的值作为键。

谢谢,

拉斐尔·阿方索

【问题讨论】:

  • 在对象文字中,属性名称必须是字符串文字(例如'keys.A')或有效的标识符。 keys.A 不是一个有效的标识符,标记器将keys. 分开,因此解析器看到一个标识符后跟一个句点,它需要一个冒号。

标签: javascript prototype-programming


【解决方案1】:

是的,更优雅的方式是使用 ES6 语法:

var values = {[keys.A]: 1, [keys.B]: 2};

括号中的东西可以是任何表达式,所以请随意:

var values = { [createPropName() + "_prop"]: 42 }

这称为“计算(动态)属性名称”。见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#Computed_property_names

【讨论】:

  • 很遗憾,我还是要用 ES5。
  • 有越来越多的工具可用于使用 ES6,因此它不再是真正的技术问题。
  • @torazaburo——但这是一个实际问题。
【解决方案2】:

试试这个

var keys = {A: 'a', B: 'b' },
    foo = {};

for (key in keys) { foo[key] = keys[key] }

【讨论】:

  • 我不明白这与 OP 的问题有什么关系。他不想将属性值复制到foo;他想将属性 on foo 设置为其他值。
  • OP 想要一个使用表达式作为键的对象文字。这仅在符合 ECMAScript Ed 6 draft Object Initiliser 且支持 ComputedPropertyName 语法的浏览器中才有可能。
【解决方案3】:

Object Initialiser 中,属性名称必须是以下之一:

  • 标识符名称
  • 字符串文字
  • 数字文字

您可以在 ES5 中使用 Object 字面量作为键,使用 Array 字面量作为值:

var keys = {A: 'a', B: 'b' };
var values = [1, 2];
var obj = {};

Object.keys(keys).forEach(function(v, i) {
  obj[v] = values[i];
});

console.log(JSON.stringify(obj)) // {"A":1,"B":2}

但是,这并不可靠,因为对象属性可能不会按照您期望的顺序返回,因此您可能会得到:

{"B":1,"A":2};

要在 ES5 中做你想做的事情并保证顺序,需要一个键数组和一个值数组,所以像:

var keys = ['a', 'b', 'c'];
var values = [1, 2, 3];
var obj = {};
keys.forEach(function(v, i) {obj[v] = values[i]});

console.log(JSON.stringify(obj)) // {"a":1, "b":2, "c":3}

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2021-05-21
    相关资源
    最近更新 更多