Javascript:遍历未知数量的对象文字

时间:2012-02-02 16:34:34

标签: javascript

我有一个以这种方式命名的对象列表:

var p1 = {};
var p2 = {};
p1.name = "john";
p1.hobby = "collects stamps";
p2.name = "jane";
p2.hobby = "collects antiques";

我知道如何循环通过p1和p2来收集属性,前提是我知道有多少p对象文字。这是我的问题,我并不总是知道这些p对象文字中有多少会有。有时它上升到p2,有时它上升到p20。

如果我知道它们都共享相同的前缀,有没有办法循环遍历对象?

编辑:我无法改变我获取对象列表的方式。它是以那种格式给我的......

4 个答案:

答案 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