Как перебрать и извлечь значения свойств из сложного объекта (массива)? - PullRequest
0 голосов
/ 13 февраля 2012

Следующий фрагмент взят из открытого покерного клиента, написанного на 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 с очень простыми массивами; из которых никто не был полезным. Второе препятствие заключается в том, как передать эту переменную вместе с функцией, которая выполняется в дочерних окнах.

Похоже, что решение этого моего собственного вопроса намного выше моей станции, я был бы очень признателен за любую информацию о том, как выполнить эту задачу.

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Чтобы перебрать каждый элемент, вы должны использовать рекурсию.Я не совсем понял, что вы хотите сделать, но вот простой пример:

function loop(obj) {
  if(obj.someprop == 'someval') {
    //do something
  } else {
    loop(obj);
  }
}
0 голосов
/ 13 февраля 2012

Я не совсем уверен, как работает 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));
            }
        }
    }
...