使用动态键创建对象

448

首先,我正在使用Node.js中的Cheerio进行DOM访问和解析。很愉快。

这里是情况:

我有一个函数,需要创建一个对象。该对象使用变量作为其键和值,然后返回该单个对象。例如:

stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    var key   = this.attr('name')
     ,  value = this.attr('value');

     return { key : value }
  }) 

  callback(null, inputs);
}

它会输出这个结果:

[ { key: '1' }, { key: '1' } ]

(.map() 返回一个对象数组)

我需要让 key 实际上成为 this.attr('name') 返回的字符串。

在 JavaScript 中,考虑到我要做什么,最好的方法是将字符串分配为键?


你可以通过以下方式获取动态对象的键:**myObj['key']**。 - Rizwan
2个回答

1173
在JavaScript的新ES2015标准(以前称为ES6)中,可以使用计算属性名创建对象:Object Initializer spec
语法如下:
var obj = {
  [myKey]: value,
}

如果应用于OP的情境,它将变成:
stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    return {
      [this.attr('name')]: this.attr('value'),
    };
  }) 

  callback(null, inputs);
}

注意: 仍需要转译器来实现浏览器兼容性

使用BabelGoogle的traceur,可以立即使用此语法


在较早的 JavaScript 规范(ES5 及以下版本)中,对象字面量中的键总是被直接解释为字符串。
要使用“动态”键,您需要使用括号表示法
var obj = {};
obj[myKey] = value;

在您的情况下:
stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    var key   = this.attr('name')
     ,  value = this.attr('value')
     ,  ret   = {};

     ret[key] = value;
     return ret;
  }) 

  callback(null, inputs);
}

6
棒极了修改。现在如果ES6能被正式发布,我们可能有机会实现世界和平! :) - JDillon522
计算属性键的更新非常棒。这正是我最近在寻找的。我只是想知道你是如何了解这个“魔法”的。是通过阅读(如此冗长的)ES2015规范文档吗? - haotang
1
对于计算的键,在使用gulp压缩任务时,我遇到了语法错误。有人遇到过这种情况吗?有解决方案吗? - Vamshi Vangapally
这个方法也适用于嵌套对象吗?假设我有一个嵌套的对象,我能使用 var obj = {[动态键][动态键]=某个值} 吗? - Mahi Tej Gvp
显示剩余3条评论

72

你无法使用动态键定义对象字面量。请尝试以下方法:

var o = {};
o[key] = value;
return o;

没有捷径(编辑:现在有了一条,使用ES6,请参见其他答案)。


9
我认为在es6中,你现在可以这样做:var propname = 'thing' {[propname]:5} -> {thing:5}更多信息请参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer - Dtipson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接