代码之家  ›  专栏  ›  技术社区  ›  Adam Lassek

如果我不知道javascript对象的名称,如何访问该对象的属性?

  •  115
  • Adam Lassek  · 技术社区  · 17 年前

    假设您有这样一个javascript对象:

    var data = { foo: 'bar', baz: 'quux' };
    

    您可以通过属性名称访问属性:

    var foo = data.foo;
    var baz = data["baz"];
    

    但是,如果您不知道属性的名称,是否可以获取这些值?这些属性的无序性是否导致无法区分它们?

    在我的例子中,我特别考虑一种情况,即函数需要接受一系列名称-值对,但属性的名称可能会更改。

    8 回复  |  直到 9 年前
        1
  •  145
  •   Ron DeVera    12 年前

    您可以通过如下方式循环键:

    for (var key in data) {
      console.log(key);
    }
    

    这将记录“名称”和“值”。

    如果您有一个更复杂的对象类型(而不仅仅是像原始问题中那样的一个简单的散列对象),那么您将只希望通过属于对象本身的键进行循环,而不是对象上的键 prototype

    for (var key in data) {
      if (data.hasOwnProperty(key)) {
        console.log(key);
      }
    }
    

    for each (var value in data) {
      console.log(value);
    }
    

    此示例循环遍历值,因此它将记录 Property Name 0 for each 语法主要只在Firefox中受支持,但在其他浏览器中不受支持。

    如果您的目标浏览器支持ES5,或者您的站点包括 es5-shim.js Object.keys :

    var data = { Name: 'Property Name', Value: '0' };
    console.log(Object.keys(data)); // => ["Name", "Value"]
    

    循环 Array.prototype.forEach :

    Object.keys(data).forEach(function (key) {
      console.log(data[key]);
    });
    // => Logs "Property Name", 0
    
        2
  •  68
  •   Adam Lassek    9 年前

    for..in

    for (var key in data) {
      if (data.hasOwnProperty(key)) {
        // do something with key
      }
    }
    

    ES5介绍 Object.keys Array#forEach 这使得这更容易:

    var data = { foo: 'bar', baz: 'quux' };
    
    Object.keys(data); // ['foo', 'baz']
    Object.keys(data).map(function(key){ return data[key] }) // ['bar', 'quux']
    Object.keys(data).forEach(function (key) {
      // do something with data[key]
    });
    

    ES2017 Object.values Object.entries .

    Object.values(data) // ['bar', 'quux']
    Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]
    
        3
  •  10
  •   karim79    17 年前
    for(var property in data) {
        alert(property);
    }
    
        4
  •  4
  •   Andreas Grech    17 年前

    您通常需要检查 对象实例的属性, 没有所有共享的原型方法和属性:

     Obj.prototype.toString= function(){
            var A= [];
            for(var p in this){
                if(this.hasOwnProperty(p)){
                    A[A.length]= p+'='+this[p];
                }
            }
    
        return A.join(', ');
    }
    
        5
  •  3
  •   Adam Lassek    11 年前
    function getDetailedObject(inputObject) {
        var detailedObject = {}, properties;
    
        do {
            properties = Object.getOwnPropertyNames( inputObject );
            for (var o in properties) {
                detailedObject[properties[o]] = inputObject[properties[o]];
            }
        } while ( inputObject = Object.getPrototypeOf( inputObject ) );
    
        return detailedObject;
    }
    

    var obj = { 'b': '4' }; //example object
    var detailedObject = getDetailedObject(obj);
    for(var o in detailedObject) {
        console.log('key: ' + o + '   value: ' + detailedObject[o]);
    }
    
        6
  •  1
  •   Mayank_VK    7 年前
    var obj = {
     a: [1, 3, 4],
     b: 2,
     c: ['hi', 'there']
     }
    for(let r in obj){  //for in loop iterates all properties in an object
     console.log(r) ;  //print all properties in sequence
     console.log(obj[r]);//print all properties values
    }
    
        7
  •  1
  •   ReinstateMonica3167040 urvashi bhagat    6 年前

    Object.keys() ,返回给定对象自身可枚举属性名称的数组,其顺序与普通循环相同

    您可以使用任何对象来代替 stats

    var stats = {
      a: 3,
      b: 6,
      d: 7,
      erijgolekngo: 35
    }
    /*  this is the answer here  */
    for (var key in Object.keys(stats)) {
      var t = Object.keys(stats)[key];
      console.log(t + " value =: " + stats[t]);
    }
        8
  •  -2
  •   isaax2    13 年前
    var attr, object_information='';
    
    for(attr in object){
    
          //Get names and values of propertys with style (name : value)
          object_information += attr + ' : ' + object[attr] + '\n'; 
    
       }
    
    
    alert(object_information); //Show all Object