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

时间:2009-03-23 21:05:43

标签: javascript object properties iteration introspection

假设你有一个像这样的javascript对象:

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

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

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

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

在我的情况下,我特别想到一个函数需要接受一系列名称 - 值对的情况,但属性的名称可能会改变。

到目前为止,我对如何执行此操作的想法是将属性的名称与数据一起传递给函数,但这感觉就像一个黑客。如果可能的话,我宁愿用内省来做这件事。

8 个答案:

答案 0 :(得分:136)

你可以像这样循环键:

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 Name0。 N.B。: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

答案 1 :(得分:56)

旧版本的JavaScript(< ES5)需要使用for..in循环:

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

ES5介绍了Object.keysArray#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.valuesObject.entries

Object.values(data) // ['bar', 'quux']
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]

答案 2 :(得分:10)

for(var property in data) {
    alert(property);
}

答案 3 :(得分:4)

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

 Obj.prototype.toString= function(){
        var A= [];
        for(var p in this){
            if(this.hasOwnProperty(p)){
                A[A.length]= p+'='+this[p];
            }
        }

    return A.join(', ');
}

答案 4 :(得分:3)

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]);
}

答案 5 :(得分:1)

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
}

答案 6 :(得分:0)

var fs   = require("fs");

fs.stat( process.argv[1], function( err, stats ){
if (err) {
     console.log( err.message ); 
     return;    
} else {
 console.log(JSON.stringify(stats));

/*  this is the answer here  */

    for (var key in Object.keys(stats)){
    var t = Object.keys( stats )[key];
    console.log( t + " value =: " + stats[t]  );
     }  

/*  to here, run in node */
   }
});

答案 7 :(得分:-3)

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