以下片段來自用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循環」有關;其中沒有任何幫助。第二個障礙是如何將這個變量和一個在子窗口中執行的函數一起傳遞。
看來,解決這個問題我自己的方式超出了我的站,我非常感謝任何關於如何完成這項任務的輸入。
我編輯了包含整個插件的代碼。 – Larry 2012-02-13 23:07:00