JavaScript:循环遍历未知数量的对象文字

4

我有一个对象列表,它们都是以这种方式命名的:

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个回答

5

如果我们做出以下假设:

  • 对象是全局的
  • 数字后缀是连续的

...那么以下内容就可以运行:

for (var i = 1; window["p" + i] !== undefined; i++) {
    console.log(window["p" + i]); // loop over each object here
}

所以基本上测试p#是否未定义,如果不是,则读取p#的属性,如果它未定义,则可以停止吗?让我测试一下并回复您。谢谢。 - newbieProgrammer
哈哈,我刚把这个解决方案添加到我的答案中,但直到现在才看到你的! - user1106925

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)全局返回一个假值。

只要找到真值并且其typeof'object',就会迭代该对象。


好的。我喜欢这个方向。那么假设我无法控制数据的输入方式,我该如何将未知数量的对象推入单个数组中? - newbieProgrammer
@newbieProgrammer:数据目前是如何给出的?你是说对象作为单独的p1p2等变量添加到脚本中吗?如果是这样,那就有点不同了。 - user1106925
是的,你说得完全正确。给我的数据是作为单个p#对象文字。 - newbieProgrammer
@newbieProgrammer:如果它们是全局变量,那么你可以将它们作为window对象的属性来访问。我在我的答案中添加了一个解决方案。 - user1106925
算了,我看到这个解决方案已经被提供了。(https://dev59.com/5l_Va4cB1Zd3GeqPY_oR#9116237) - user1106925

0
为什么不把它们全部存储在一个顶层对象文本中?这将使遍历更容易。
例如:
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;
    }
}

我不建议使用这个,我建议改变你接收到的数据格式,但这是一个可能的解决方案。

我无法控制我接收对象列表的方式。因此,将它们全部存储在单个顶级对象文字中需要一些技巧,因为我必须先读取输入,然后重新格式化才能循环遍历它。如果这是唯一的方法,那我会这样做。 - newbieProgrammer
你是如何接收对象列表的?它们的范围是什么? - badsyntax
我从一个post调用的响应中接收对象列表。因此,当我读取它时,post响应以纯文本形式呈现,并且范围仅限于您所看到的内容。 - newbieProgrammer
你应该使用JSON格式传输这些数据,这是可能的吗? - badsyntax
是的,你说得对,用JSON格式会更好。不幸的是,我无法控制Web服务向我输出数据的方式。 - newbieProgrammer

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接