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

Ada*_*sek 120 javascript iteration properties introspection object

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

var data = { foo: 'bar', baz: 'quux' };
Run Code Online (Sandbox Code Playgroud)

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

var foo = data.foo;
var baz = data["baz"];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ron*_*era 139

你可以像这样循环键:

for (var key in data) {
  console.log(key);
}
Run Code Online (Sandbox Code Playgroud)

这会记录"名称"和"值".

如果你有一个更复杂的对象类型(不仅仅是一个普通的类似哈希的对象,就像在原始问题中那样),你只需要遍历属于对象本身的键,而不是对象原型上的键:

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    console.log(key);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

for each (var value in data) {
  console.log(value);
}
Run Code Online (Sandbox Code Playgroud)

这个例子循环遍历值,所以它会记录Property Name0.注意:for each语法主要仅在Firefox中支持,但在其他浏览器中不支持.

如果您的目标浏览器支持ES5,或者您的网站包含es5-shim.js(推荐),您还可以使用Object.keys:

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

并循环Array.prototype.forEach:

Object.keys(data).forEach(function (key) {
  console.log(data[key]);
});
// => Logs "Property Name", 0
Run Code Online (Sandbox Code Playgroud)

  • btw alert是调试的好方法,试试console.log (27认同)

Ada*_*sek 62

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

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    // do something with key
  }
}
Run Code Online (Sandbox Code Playgroud)

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]
});
Run Code Online (Sandbox Code Playgroud)

ES2017介绍Object.valuesObject.entries.

Object.values(data) // ['bar', 'quux']
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]
Run Code Online (Sandbox Code Playgroud)

  • 现在这实际上回答了这个问题,做得好@Adam Lassek,做得非常好。 (2认同)
  • @JamesNicholson我同意,编辑不那么混乱. (2认同)

kar*_*m79 10

for(var property in data) {
    alert(property);
}
Run Code Online (Sandbox Code Playgroud)