![](/img/trans.png)
[英]Javascript: How do I access values in nested objects if I don’t know the object’s key?
[英]How do I access properties of a javascript object if I don't know the names?
假设您有这样的 javascript object:
var data = { foo: 'bar', baz: 'quux' };
您可以通过属性名称访问属性:
var foo = data.foo;
var baz = data["baz"];
但是,如果您不知道属性的名称,是否可以获得这些值? 这些属性的无序性质是否无法区分它们?
在我的情况下,我特别考虑 function 需要接受一系列名称-值对的情况,但属性的名称可能会改变。
到目前为止,我对如何做到这一点的想法是将属性的名称与数据一起传递给 function,但这感觉像是一个 hack。 如果可能的话,我更愿意通过内省来做到这一点。
您可以像这样遍历键:
for (var key in data) {
console.log(key);
}
这会记录“名称”和“值”。
如果您有更复杂的 object 类型(不仅仅是像原始问题中那样的普通散列式 object),您将只想遍历属于 object 原型的键,而不是对象本身的键:
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
JavaScript (< ES5) 的旧版本需要使用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']]
for(var property in data) {
alert(property);
}
您经常需要检查 object 实例的特定属性,而不需要它的所有共享原型方法和属性:
Obj.prototype.toString= function(){
var A= [];
for(var p in this){
if(this.hasOwnProperty(p)){
A[A.length]= p+'='+this[p];
}
}
return A.join(', ');
}
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;
}
这将在新的 object 中获取所有属性及其值(继承或拥有,可枚举或不可枚举)。 原版 object 未受影响。 现在可以使用新的 object 遍历
var obj = { 'b': '4' }; //example object
var detailedObject = getDetailedObject(obj);
for(var o in detailedObject) {
console.log('key: ' + o + ' value: ' + detailedObject[o]);
}
您可以使用Object.keys() ,“它返回给定对象自己的可枚举属性名称的数组,其顺序与我们使用普通循环获得的顺序相同。”
您可以使用任何 object 代替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]); }
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
}
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.