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

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

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

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

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

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

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

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


答案 1

您可以像这样循环访问键:

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

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

如果您有更复杂的对象类型(而不仅仅是像原始问题中那样的类似哈希的简单对象),您将需要仅遍历属于对象本身的键,而不是对象原型上的键:

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

如您所见,不保证密钥按任何特定顺序排列。请注意这与以下内容有何不同:

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

此示例循环遍历值,因此它将记录 和 。注意:每种语法大多只在Firefox中受支持,而在其他浏览器中不受支持。Property Name0

如果您的目标浏览器支持 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

旧版本的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.entrys

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