我有一个以这种方式命名的对象列表:
var p1 = {};
var p2 = {};
p1.name = "john";
p1.hobby = "collects stamps";
p2.name = "jane";
p2.hobby = "collects antiques";
我知道如何循环通过p1和p2来收集属性,前提是我知道有多少p对象文字。这是我的问题,我并不总是知道这些p对象文字中有多少会有。有时它上升到p2,有时它上升到p20。
如果我知道它们都共享相同的前缀,有没有办法循环遍历对象?
编辑:我无法改变我获取对象列表的方式。它是以那种格式给我的......
答案 0 :(得分:5)
如果我们做出以下假设:
...然后以下工作:
for (var i = 1; window["p" + i] !== undefined; i++) {
console.log(window["p" + i]); // loop over each object here
}
答案 1 :(得分:2)
您应该将它们放在由单个变量引用的数组中。
var p = [];
p.push({
name:"john",
hobby:"collects stamps"
}, {
name:"jane",
hobby:"collects antiques"
});
然后你循环数组,并枚举每个对象......
for( var i = 0; i < p.length; i++ ) {
for( var n in p[i] ) {
console.log( p[i][n] );
}
}
修改强>
从评论中可以看出,这些作为单个变量到达。
如果它们是全局变量,并且它们总是具有相同的p1
命名,那么您可以将它们作为全局window
对象的属性进行访问。
var obj;
for( var i = 1; obj = window['p' + i]; i++ ) {
if( typeof obj === 'object' ) {
for( var n in obj ) {
console.log( obj[n] );
}
}
}
此循环将一直运行,直到p(n)
全局返回falsey值。
只要找到真值,并且typeof
为'object'
,您就会迭代该对象。
答案 2 :(得分:0)
为什么不将它们全部存储在一个顶级对象文字中?它可以更容易地通过它们进行枚举。
EG:
var MyObj = {
p1: {},
p2: {}
};
等。
[编辑]
如果它们是本地变量,您是否无法更改此数据的格式,则可能必须使用eval。 不要开枪打死我:
var p1 = {};
var p2 = {};
p1.name = "john";
p1.hobby = "collects stamps";
p2.name = "jane";
p2.hobby = "collects antiques";
var found = true, c = 1;
while(found) {
try {
var obj = eval('p' + c);
c++;
console.log(obj);
} catch(e){
found = false;
}
}
我建议不要使用此功能,我建议您更改所接收数据的格式,但这是一种可能的解决方案。
答案 3 :(得分:0)
如果您将所有数据存储在变量或少数变量中,则可将其推入阵列。
var data = "....JSON";
var a = [];
a.push(data);
Push在基本意义上不断向数组添加内容。 您也可以弹出以删除最后推送的数据。
在这里看看其他方法:
http://www.w3schools.com/jsref/jsref_obj_array.asp
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array