【问题标题】:Add a property to a JavaScript object using a variable as the name?使用变量作为名称向 JavaScript 对象添加属性?
【发布时间】:2010-10-16 06:06:03
【问题描述】:

我正在使用 jQuery 从 DOM 中提取项目,并希望使用 DOM 元素的 id 在对象上设置属性。

示例

const obj = {}

jQuery(itemsFromDom).each(function() {
  const element = jQuery(this)
  const name = element.attr('id')
  const value = element.attr('value')

  // Here is the problem
  obj.name = value
})

如果itemsFromDom 包含一个带有“myId”的id 的元素,我希望obj 有一个名为“myId”的属性。以上给了我name

如何使用 JavaScript 使用变量命名对象的属性?

【问题讨论】:

标签: javascript jquery object syntax


【解决方案1】:

你可以使用这个等价的语法:

obj[name] = value

示例

let obj = {};
obj["the_key"] = "the_value";

或具有 ES6 功能:

let key = "the_key";
let obj = {
  [key]: "the_value",
};

在这两个示例中,console.log(obj) 将返回:{ the_key: 'the_value' }

【讨论】:

    【解决方案2】:

    你甚至可以制作这样的对象列表

    var feeTypeList = [];
    $('#feeTypeTable > tbody > tr').each(function (i, el) {
        var feeType = {};
    
        var $ID = $(this).find("input[id^=txtFeeType]").attr('id');
    
        feeType["feeTypeID"] = $('#ddlTerm').val();
        feeType["feeTypeName"] = $('#ddlProgram').val();
        feeType["feeTypeDescription"] = $('#ddlBatch').val();
    
        feeTypeList.push(feeType);
    });
    

    【讨论】:

      【解决方案3】:

      使用ECMAScript 2015,您可以直接在对象声明中使用方括号表示法:

      var obj = {
        [key]: value
      }
      

      key 可以是任何类型的返回值的表达式(例如变量):

      var obj = {
        ['hello']: 'World',
        [x + 2]: 42,
        [someObject.getId()]: someVar
      }
      

      【讨论】:

      • 这个问题是关于修改现有对象,而不是创建一个新对象。
      • 这个特殊的问题可能是关于修改的,但它被其他关于动态创建对象的问题所引用,所以我最终来到这里并很高兴地从这个答案中受益。
      • 我不确定 ECMAScript 6 是什么,但我非常感谢它
      • @ArthurTarasov:ECMAScript 6 更正式地称为 ECMAScript 2015 ("ES2015") 又名 ECMAScript 6th edition ("ES6")。它是 2015 年 6 月发布的 JavaScript 规范。从那时起,我们就有了 ES2016,很快我们就会有 ES2017,它们现在处于一年周期。
      【解决方案4】:

      使用 lodash,您可以创建像这样的新对象 _.set:

      obj = _.set({}, key, val);
      

      或者您可以像这样设置为现有对象:

      var existingObj = { a: 1 };
      _.set(existingObj, 'a', 5); // existingObj will be: { a: 5 }
      

      如果你想在你的路径中使用点(“.”),你应该小心,因为 lodash 可以设置层次结构,例如:

      _.set({}, "a.b.c", "d"); // { "a": { "b": { "c": "d" } } }
      

      【讨论】:

        【解决方案5】:

        随着 ES2015 Object.assigncomputed property names 的出现,OP 的代码归结为:

        var obj = Object.assign.apply({}, $(itemsFromDom).map((i, el) => ({[el.id]: el.value})));
        

        【讨论】:

          【解决方案6】:

          objectname.newProperty = value;

          【讨论】:

            【解决方案7】:

            如果你想动态地给一个对象添加字段,最简单的方法如下:

            let params = [
              { key: "k1", value: 1 },
              { key: "k2", value: 2 },
              { key: "k3", value: 3 },
            ];
            let data = {};
            
            for (let i = 0; i < params.length; i++) {
              data[params[i].key] = params[i].value;
            }
            
            console.log(data); // -> { k1: 1, k2: 2, k3: 3 }
            

            【讨论】:

              【解决方案8】:

              首先我们需要将 key 定义为变量,然后我们需要将 key 赋值为 object。例如

              var data = {key:'dynamic_key',value:'dynamic_value'}
              var key = data.key;
              var obj = { [key]: data.value}
              console.log(obj)

              【讨论】:

                【解决方案9】:

                访问对象属性有两种不同的表示法

                • 表示法:myObj.prop1
                • 括号表示法:myObj["prop1"]

                点表示法既快速又简单,但您必须明确地使用实际的属性名称。没有替换、变量等。

                括号符号是开放式的。它使用字符串,但您可以使用任何合法的 js 代码生成字符串。您可以将字符串指定为文字(尽管在这种情况下点表示法更容易阅读)或使用变量或以某种方式计算。

                所以,这些都将名为 prop1myObj 属性设置为值 Hello

                // quick easy-on-the-eye dot notation
                myObj.prop1 = "Hello";
                
                // brackets+literal
                myObj["prop1"] = "Hello";
                
                // using a variable
                var x = "prop1"; 
                myObj[x] = "Hello";                     
                
                // calculate the accessor string in some weird way
                var numList = [0,1,2];
                myObj[ "prop" + numList[1] ] = "Hello";     
                

                陷阱:

                myObj.[xxxx] = "Hello";      // wrong: mixed notations, syntax fail
                myObj[prop1] = "Hello";      // wrong: this expects a variable called prop1
                

                tl;dnr:如果要计算或引用密钥,必须使用括号表示法。如果您明确使用密钥,则使用 点表示法 以获得简单清晰的代码。

                注意:还有一些其他好的和正确的答案,但我个人发现它们有点简短,因为对 JS on-the-fly 的怪癖不熟悉。这可能对某些人有用。

                【讨论】:

                  【解决方案10】:
                  const data = [{
                      name: 'BMW',
                      value: '25641'
                    }, {
                      name: 'Apple',
                      value: '45876'
                    },
                    {
                      name: 'Benz',
                      value: '65784'
                    },
                    {
                      name: 'Toyota',
                      value: '254'
                    }
                  ]
                  
                  const obj = {
                    carsList: [{
                      name: 'Ford',
                      value: '47563'
                    }, {
                      name: 'Toyota',
                      value: '254'
                    }],
                    pastriesList: [],
                    fruitsList: [{
                      name: 'Apple',
                      value: '45876'
                    }, {
                      name: 'Pineapple',
                      value: '84523'
                    }]
                  }
                  
                  let keys = Object.keys(obj);
                  
                  result = {};
                  
                  for(key of keys){
                      let a =  [...data,...obj[key]];
                      result[key] = a;
                  
                  }
                  

                  【讨论】:

                    【解决方案11】:

                    如果你有对象,你可以创建键数组,而不是映射,并从以前的对象键和值创建新对象。

                    Object.keys(myObject)
                    .map(el =>{
                     const obj = {};
                     obj[el]=myObject[el].code;
                     console.log(obj);
                    });
                    

                    【讨论】:

                      【解决方案12】:

                      ajavascript 有两种类型的注释用于获取 javascript 对象属性:

                      对象 = {};

                      1) (.) 注释,例如。对象标识 这仅在对象已经具有名称为“id”的属性时才有效

                      2) ([]) 注释,例如 .此处的 Obj[id] 如果对象没有任何名称为 'id' 的属性,它将创建一个名称为 'id' 的新属性。

                      下面的例子:

                      当您编写 Obj[name] 时,总是会创建一个新属性。 如果该属性已经存在同名,它将覆盖它。

                      const obj = {}
                          jQuery(itemsFromDom).each(function() {
                            const element = jQuery(this)
                            const name = element.attr('id')
                            const value = element.attr('value')
                            // This will work
                            obj[name]= value;
                          })
                      

                      【讨论】:

                        【解决方案13】:

                        与主题相关,但并非专门针对 jquery。我在 ec6 react 项目中使用了这个,可能对某人有帮助:

                        this.setState({ [`${name}`]: value}, () => {
                              console.log("State updated: ", JSON.stringify(this.state[name]));
                            });
                        

                        PS:请注意引号字符。

                        【讨论】:

                        • 根据上述答案,{ [${name}]: value} 可以简单地为 { [name]: value}。模板文字是不必要的。
                        【解决方案14】:

                        访问对象值的三种方式 我们可以通过传入适当的键来输出对象值。因为我在示例中使用了表情符号作为键,所以有点棘手。所以让我们看一个更简单的例子。

                        let me = {
                          name: 'samantha',
                        };
                        
                        // 1. Dot notation
                        me.name; // samantha
                        
                        // 2. Bracket notation (string key)
                        me['name']; // samantha
                        
                        // 3. Bracket notation (variable key)
                        let key = 'name';
                        me[key]; // samantha
                        

                        know more

                        【讨论】:

                          猜你喜欢
                          • 2013-06-19
                          • 1970-01-01
                          • 2013-11-23
                          • 2012-06-18
                          • 2011-11-29
                          • 2011-11-30
                          相关资源
                          最近更新 更多