【问题标题】:Shorthand way to construct JS object with variable property name [duplicate]构造具有变量属性名称的JS对象的简写方法[重复]
【发布时间】:2012-07-04 09:58:31
【问题描述】:

有没有一种快捷的方式来创建一个带有属性字段变量的对象?

假设我有变量PROP.Todo.PRIORITY = 'priority',然后在这个例子中使用Backbone,我想save这个属性,我怎样才能避免创建一个新对象,将它分配给某个变量然后设置财产?

我想实现这个:

var tmpObj = {};
tmpObj[PROP.Todo.PRIORITY] = "high";
this.model.save(tmpObj);

我尝试过类似的方法,但没有成功:

this.model.save(({}[PROP.Todo.PRIORITY] = "high"));

有什么建议吗?否则我会写很多长篇的对象声明。

【问题讨论】:

    标签: javascript backbone.js javascript-objects


    【解决方案1】:

    如果只保存一个参数,Model.save 有另一种接收参数的方式,(key,value,options)

    http://backbonejs.org/#Model-save

    保存 model.save([attributes], [options])
    [...] 与 set 一样,您可以传递单个键和值而不是散列。 [...]

    这意味着你可以把你的例子写成

    this.model.save(PROP.Todo.PRIORITY, "high");
    

    如果要同时保存多个属性,则必须编写一个临时对象。

    【讨论】:

    • +1 用于阅读文档。 :) 没有意识到有办法做到这一点。
    • 谢谢 - 这就是我要去做的。但是我想我会接受另一个答案,因为如果人们通过谷歌到达这里,它会更直接地回答问题的标题。希望你能理解!
    • 值得注意;我使用的是TODO MVC webapp,它使用不支持建议的保存属性的方式的主干0.5.0-pre。然而最新版本(0.9.2 在撰写本文时)确实如此。
    • @Ed。很好,我忘记了这个语法是 0.9.0 附带的
    【解决方案2】:

    如果您只是想要一种更简单的方法来创建对象,那么使用辅助函数怎么样?

    function obj(prop, value) {
      var o = {};
      o[prop] = value;
      return o;
    }
    
    this.model.save(obj(PROP.Todo.PRIORITY, "high"));
    

    我不确定我是否理解你问题的后半部分:

    否则我将创建很多临时对象。

    在任何情况下你都必须创建一个对象,我怀疑创建对象是一个性能问题。

    【讨论】:

    • 感谢您的回答 - 我喜欢这个解决方案,尽管其他答案可能是我选择的路线。是的,我的措辞本来可以更好;我的意思不是“临时的”,我的意思是需要大量声明新对象......即大量的代码膨胀,这不是性能问题。
    猜你喜欢
    • 2011-03-10
    • 2011-04-29
    • 2012-06-20
    • 2013-07-23
    相关资源
    最近更新 更多