2012-02-13 174 views
0

以下片段來自用JQuery編寫的開源撲克客戶端。它顯示撲克服務器以前產生的撲克桌。在頁面加載後,該表格會顯示在頁面的div中。如何遍歷並從複雜對象(數組)中提取屬性值?

// 
// featured table 
// 
jpoker.plugins.featuredTable = function(url, options) { 

    var opts = $.extend({}, jpoker.plugins.featuredTable.defaults, options); 
    var server = jpoker.url2server({ url: url }); 

server.registerUpdate(function(server, what, packet) { 
    if (packet && packet.type == 'PacketPokerTableList') { 
     if (packet.packets.length === 0) { 
     var updated = function(server, what, packet) { 
      if(packet && packet.type == 'PacketPokerTableList') { 
      var found = null; 
      for(var i = packet.packets.length - 1; i >= 0 ; i--) { 
       var subpacket = packet.packets[i]; 
       if(opts.compare(found, subpacket) >= 0) { 
       found = subpacket; 
       } 
      } 
      if(found) { 
       found.game_id = found.id; 
       server.setTimeout(function() { server.tableJoin(found.game_id); }, 1); 
      } 
      return false; 
      } else { 
      return true; 
      } 
     }; 
     server.registerUpdate(updated, null, 'featuredTable ' + url); 
     server.selectTables(opts.string); 
     } 
     return false; 
    } else { 
     return true; 
    } 
    }, null, 'featuredTable ' + url); 
    server.selectTables('my'); 
    return this; 
}; 

jpoker.plugins.featuredTable.defaults = { 
    string: '', 
    compare: function(a, b) { return a && b && b.players - a.players; } 
}; 

該代碼引用以下複雜的動態對象。

{"players":3,"type":"PacketPokerTableList","packets":[{"observers":1,"name":"sitngo417","waiting":0,"percent_flop":0,"average_pot":10852,"skin":"default","variant":"holdem","hands_per_hour":120,"betting_structure":"level-15-30-no-limit","currency_serial":0,"muck_timeout":5,"players":2,"reason":"TableList","tourney_serial":58151,"seats":2,"player_timeout":60,"type":"PacketPokerTable","id":97},{"observers":0,"name":"sitngo418","waiting":0,"percent_flop":100,"average_pot":97700,"skin":"default","variant":"holdem","hands_per_hour":100,"betting_structure":"level-15-30-no-limit","currency_serial":0,"muck_timeout":5,"players":1,"reason":"TableList","tourney_serial":58151,"seats":2,"player_timeout":60,"type":"PacketPokerTable","id":98}],"tables":2,"time__":1329073257148} 

實質上,如果您願意,數組中的對象或數組中的數組可能存在嵌套對象。主對象被稱爲「分組」,其類型爲「PacketPokerTableList」,並且嵌套對象被命名爲「分組」,其中每個分組內的每個子分組具有「PacketPokerTable」類型。在數據包內可以有任意數量的子數據包,它們根據給定比賽中表的數量而變化。 「PacketPokerTable」類型的每個子分組都包含許多具有給定值的元素,該值是比賽中每個表的代表。上面代碼中的for循環僅查看包中的第一個子包並檢索「id」的值,在本例中爲97,然後通過調用server.tableJoin()來顯示錶。

我希望修改這個默認行爲,以便「for循環」在數據包類型「PacketPokerTableList」內循環遍歷所有類型爲「PacketPokerTable」的子數據包,並從每個子數據包中檢索「id」的值。 然後,而不是自動顯示當前頁面的div中的表;我希望爲每個表「id」使用window.open()方法在新的瀏覽器窗口中顯示其相關表。

我無法克服的第一個問題是如何遍歷這個複雜的對象並檢索所有「id」的值。不確定是否可能。我在網上研究的所有東西大多都與非常基本的數組的「for循環」有關;其中沒有任何幫助。第二個障礙是如何將這個變量和一個在子窗口中執行的函數一起傳遞。

看來,解決這個問題我自己的方式超出了我的站,我非常感謝任何關於如何完成這項任務的輸入。

+0

我編輯了包含整個插件的代碼。 – Larry 2012-02-13 23:07:00

回答

0

我不能完全肯定server.tableJoin()是如何工作的,但如果它的表返回的HTML,然後這將會訣竅。如果沒有,你需要做任何事情來爲新表格創建html並將其放置到位。

//make sure the object has the necessary info  
if(packet && packet.type == 'PacketPokerTableList' && packet.packets && packet.packets.length > 0) { 
     //go through each packet.packets 
     for (var i=0;i < packet.packets.length;i++){ 
      if(packet.packets[i].type == 'PacketPokerTable'){ 
       var id = packet.packets[i].id; 
       //open window 
       var newWin = window.open('_blank',id); 
       //write new content in the new window 
       newWin.document.write(server.tableJoin(id)); 
      } 
     } 
    } 
+0

謝謝您的反饋!我試過Will Stern的循環,它找到了ID。但是window.open方法並不完全工作。兩個窗口將在瀏覽器的單獨標籤中打開,但是,頁面僅在每個頁面上顯示「未定義」一詞。我在代碼顯示方面可能太簡潔了;所以我將編輯問題代碼以包含代碼的整個插件。這可能有助於清除server.tableJoin()的不確定性。 – Larry 2012-02-13 22:18:47

+0

server.tableJoin()顯然返回「undefined」。如果用一個返回表格HTML的函數替換它,那麼它會將表格打印出來到每個窗口中。我無法幫助你,因爲我不知道你的表格html是什麼樣的。 – 2012-02-14 15:01:49

1

要遍歷每個元素,您必須使用遞歸。我真的不明白你想做的事,但這裏是一個簡單的例子:

function loop(obj) { 
    if(obj.someprop == 'someval') { 
    //do something 
    } else { 
    loop(obj); 
    } 
} 
相關問題