Следующий фрагмент взят из открытого покерного клиента, написанного на 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 циклически проходил по всем подпакетам типа «PacketPokerTable» в типе пакета «PacketPokerTableList» и извлекал значение «id» из каждого из подпакетов.
Затем вместо автоматического отображения таблицы в div текущей страницы; Я хочу, чтобы для каждой таблицы "id" отображалась соответствующая таблица в новом окне браузера с помощью метода window.open ().
Первое, что мне не удалось преодолеть, - это как пройти через этот сложный объект и извлечь все значения «id». Не уверен, возможно ли это или нет. Все, что я исследовал в Интернете, в основном относится к циклам for с очень простыми массивами; из которых никто не был полезным. Второе препятствие заключается в том, как передать эту переменную вместе с функцией, которая выполняется в дочерних окнах.
Похоже, что решение этого моего собственного вопроса намного выше моей станции, я был бы очень признателен за любую информацию о том, как выполнить эту задачу.