【问题标题】:How to create an object property from a variable value in JavaScript? [duplicate]如何从 JavaScript 中的变量值创建对象属性? [复制]
【发布时间】:2016-11-04 18:58:26
【问题描述】:

我想向“myObj”添加一个新属性,将其命名为“string1”并给它一个值“string2”,但是当我这样做时它返回“undefined:”

var myObj = new Object;
var a = 'string1';
var b = 'string2';
myObj.a = b;

alert(myObj.string1); //Returns 'undefined'
alert(myObj.a); //Returns 'string2'

换句话说:我如何创建一个对象属性并赋予它存储在变量中的名称,而不是变量本身的名称?

【问题讨论】:

  • @Bergi,这个问题和答案不是重复的!另一个是 JQuery,这个是 vanilla js
  • @daniella 对象属性绝对是纯 JavaScript。在 jQuery 示例中使用它是无关紧要的。
  • 为了记录,永远不要使用new Object;改用对象文字:var myObj = {}

标签: javascript properties object


【解决方案1】:

【讨论】:

  • 它们并不是真正的“等价物”; myObj.a = bmyObj[a] = b 的含义不同(除非 a == 'a'),但无论如何……这就是你想要的。
  • 我的意思是它们是设置属性的等效方法。显然它们的行为不同(因此发布此答案的目的)-但它们具有相同的结果。
  • philfreo:除了他们有相同的结果,这是这个问题的基础。
  • 我只是说有两种设置对象的方法,一种用于硬编码键,另一种用于可变键。我的意思是无论您使用myObj['foo'] = 'bar' 还是myObj.foo = 'bar',对象的结果都是相同的
  • 不知何故这个方法给了我一个数组[a:b]而不是{a:b}
【解决方案2】:

ES6 引入了计算属性名,让你可以这样做

var myObj = {[a]: b};

注意浏览器支持目前可以忽略不计。

【讨论】:

  • 与 Babel 一起使用。
  • 对于像我这样使用 Node.js 开发并且只需要它作为后端的人,因此不用担心浏览器的实现,这非常有用。应该有更多的赞成票!
  • 这实际上看起来像是创建以变量为键的匿名对象的唯一方法,当您只需要将其推送到数组时非常有用。
  • 目前支持哪些浏览器?
【解决方案3】:

点符号和属性是等价的。所以你会这样完成:

var myObj = new Object;
var a = 'string1';
myObj[a] = 'whatever';
alert(myObj.string1)

(警告“随便”)

【讨论】:

    【解决方案4】:

    Ecu,如果您执行myObj.a,那么它会查找名为 a 的 myObj 的属性。 如果您执行myObj[a] =b,那么它会查找myObj 的a.valueOf() 属性。

    【讨论】:

      【解决方案5】:

      Oneliner:

      obj = (function(attr, val){ var a = {}; a[attr]=val; return a; })('hash', 5);
      

      或者:

      attr = 'hash';
      val = 5;
      var obj = (obj={}, obj[attr]=val, obj);
      

      还有更短的吗?

      【讨论】:

      • 我不确定你是否可以把它算作单行,因为里面的函数有三个语句,而不是一个(这通常是单行的要求)。跨度>
      • 我喜欢第二个 sn-p 的优雅。这是有道理的,因为 var 做了两个动作,第一个动作是将变量“定义”为未定义。
      • 虽然不太可读。
      【解决方案6】:

      你可以用这个:

      function createObject(propName, propValue){
          this[propName] = propValue;
      }
      var myObj1 = new createObject('string1','string2');
      

      您作为第一个参数传递的任何内容都是属性名称,第二个参数是属性值。

      【讨论】:

        【解决方案7】:

        您不能使用变量通过点表示法访问属性,而是使用数组表示法。

        var obj= {
             'name' : 'jroi'
        };
        var a = 'name';
        alert(obj.a); //will not work
        alert(obj[a]); //should work and alert jroi'
        

        【讨论】:

          【解决方案8】:

          由于 $scope 是一个对象,您可以通过以下方式尝试 JavaScript:

          $scope['something'] = 'hey'
          

          等于:

          $scope.something = 'hey'
          

          I created a fiddle to test.

          【讨论】:

            【解决方案9】:

            下面演示了一种使用(a, b) 形式返回密钥对对象的替代方法。第一个示例使用字符串'key' 作为属性名,使用'val' 作为值。

            示例 #1:

            (function(o,a,b){return o[a]=b,o})({},'key','val');
            

            示例:#2:

            var obj = { foo: 'bar' };
            (function(o,a,b){return o[a]=b,o})(obj,'key','val');
            

            如第二个示例所示,这也可以修改现有对象(如果对象中已经定义了属性,则值将被覆盖)

            结果 #1: { key: 'val' }

            结果 #2: { foo: 'bar', key: 'val' }

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-05-30
              • 2020-01-09
              • 2012-11-25
              • 1970-01-01
              • 2010-12-14
              相关资源
              最近更新 更多