2012-02-02 39 views
4

我有對象的列表都以這種方式命名:的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。

如果我知道它們都共享相同的前綴,是否有方法來循環對象?

編輯:我無法改變我得到的對象列表。它以這種格式發給我......

+0

只要把它們放入數組。 – 2012-02-02 16:37:18

回答

5

如果我們做如下假設:

  • 的對象是全球
  • 數後綴是連續

...那麼以下工作:

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

所以基本上測試p#以查看它是否未定義,如果不是,讀取p#的屬性,如果它未定義,我可以停止?讓我測試一下並回復你。謝謝。 – newbieProgrammer 2012-02-02 16:50:31

+0

@newbieProgrammer - 是的。 – 2012-02-02 16:54:48

+0

Gasp ...我發佈了我的答案太晚了...... – JScoobyCed 2012-02-02 17:00:59

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; 
    } 
} 

我不建議使用此,我建議改變您收到的數據的格式,但是這是一個可能的解決方案。

+0

我無法控制我如何接收對象列表。因此,將它們全部存儲在單個頂級對象文本中需要一些技巧,因爲我必須讀入輸入,然後在循環播放之前重新格式化。如果這是唯一的方式,我會這樣做。 – newbieProgrammer 2012-02-02 16:40:02

+0

你究竟如何接收對象列表?你接受他們的範圍是什麼? – badsyntax 2012-02-02 16:43:18

+0

我收到來自郵寄回復回復的對象列表。所以後期迴應以純文本的形式出現在我的面前,當我閱讀它時,範圍正是您所看到的。 – newbieProgrammer 2012-02-02 16:47:39

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]); 
    } 
} 

編輯:

它從評論看來,這可能是作爲單個變量到達

如果它們是全局變量,並且它們始終具有相同的命名,則可以將它們作爲全局的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',您將迭代該對象。

+0

好的。我喜歡這裏的情況。所以假設我無法控制數據是如何傳給我的。如何將未知數量的對象推送到單個數組中? – newbieProgrammer 2012-02-02 16:44:10

+0

@newbieProgrammer:目前的數據如何?你是說這些對象是作爲單獨的'p1','p2'等變量添加到腳本中的嗎?如果是這樣,那會讓事情有點不同。 – 2012-02-02 16:56:28

+0

是的,你完全正確。給我的數據是個別的p#對象文字。 – newbieProgrammer 2012-02-02 16:59:52