【问题标题】:JS - Create object shorthandJS - 创建对象的简写
【发布时间】:2015-02-15 09:04:26
【问题描述】:

取下面的对象:

var value = 'bar';
var obj = { foo: value }
// -> Object { foo="bar" }

假设键也是一个变量,可以这样:

var key = 'foo', value = 'bar';
var obj = {}
obj[key] = value;
// -> Object { foo="bar" }

现在,我想在一行中执行此操作(速记)。所以我尝试了:

var obj = {}[key] = value; // or,
var obj = ({})[key] = value; // or,
var obj = new Object()[key] = value;
// -> "bar"

这奇怪地产生了一个字符串而不是一个对象。

有没有办法做到这一点?

【问题讨论】:

  • 不,没有,为什么会有!
  • 同样的原因我会使用 {} 而不是 new Object()。在某些情况下它更干净。
  • var obj = new Object()[key] = value;var obj = {}; obj[key] = value; 好多少?
  • 仅限 ES6 obj = {[key]: value}
  • 您的任何尝试都比简单地在两行上输入更干净......

标签: javascript syntax shorthand


【解决方案1】:

ECMAScript 6 将允许您这样做

var obj = {
    [key]: value
};

Browser support 还不是很好,但是6to5 等转译器允许您今天使用这种表示法!

【讨论】:

  • 期待:)
【解决方案2】:

你可以,或者几乎可以。如果将对象的创建及其对obj 的赋值放在括号中,则可以设置该表达式结果的属性:

var obj, key='foo', value = 'bar';
(obj = {})[key] = value;

alert(obj);  // [object Object]
alert(obj.foo);  // bar

var 关键字不能包含在括号内的表达式中,因此您必须在之前声明 obj(就像我所做的那样),或者根本不声明它并接受它将在全局范围内。

【讨论】:

  • 这正是我想要的。
  • 很好,但它依赖于返回分配值的赋值,我认为我不会在生产中使用它,但它很聪明。
  • 没有比这更干净的了。
  • 这不是两行吗?
  • @dc2 这不干净,如果有的话,这只是在混淆你的代码!不要使用这个,或者这里的任何答案。将一堆东西放在一条线上并不是一个理想的目标。您需要专注于编写可读代码,而不是编写代码。所有这些答案在技术上都是正确的,但普遍可怕。任何审查您的代码的开发人员都会告诉您修复任何此类实例。如果我遇到(obj = {})[key] = value;,我会立即将其删除,git blame,并告诉负责人不要再这样做了。
【解决方案3】:

取决于你所说的单线,你可以用一些代码打高尔夫球

var obj = (function(o) {o[key]=value; return o})({});

它认为这是最短的吗?

【讨论】:

  • @Hristo 那是一个空对象被传递到立即执行的匿名函数中
  • 我还在努力理解...函数表达式立即执行并返回一个对象。直观地说,我认为末尾括号中的空对象 {} ({}) 将被视为函数 (o) 的参数。那是对的吗?我只是没有得到右边的 ({}) 和左边的匿名函数表达式 (function(o){...}) 的关系?!
  • @Hristo - 如果你把它分开可能会更清楚 -> jsfiddle.net/puk7kafy
  • 不,关于空对象的部分很清楚......但是像function(){}()这样的函数定义我无法理解......通常它应该像function( ){} ...请给我第二对括号的参考 - 它们是什么以及这个定义是否可以在其他情况下使用?
  • @Hristo 如果你命名函数并将其分解,它应该澄清空对象正在传递给函数function create(o) {o[key]=value; return o}; 现在像var obj = create({})一样使用它然后如果你按照自己的方式工作返回并内联create 函数,它应该会看到发生了什么,你只需要意识到函数周围有括号。
【解决方案4】:

类似is coming in ECMAScript 6:

在 ECMAScript 6 中,可以使用更短的符号来实现 一样的:

var a = "foo", 
    b = 42, 
    c = {};

// Shorthand property names (ES6) 
var o = { a, b, c };

因此您可以使用以下代码创建对象

var foo = 'bar';
var obj = {foo};

【讨论】:

    【解决方案5】:

    ECMAScript 5(当前版本)中没有简写,但你可以创建一个方法

    function createObject(key, value /*, key, value, ... */ ) {
        var object = {};
        for (var i = 0; i < arguments.length; i = i + 2) {
            object[arguments[i]] = arguments[i+1];
        }
        return object;
    }
    

    那你就可以这样称呼了

    var obj = createObject(key, value, 'anotherKey', 'anotherVal');
    

    【讨论】:

    • 这不是八行吗? ;-)
    • 每次调用一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多