如何循环并从复杂对象(Array)中提取属性值?

时间:2012-02-13 16:34:28

标签: javascript jquery for-loop window.open

以下片段来自用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}

基本上,如果您愿意,对象中的嵌套对象或数组中的数组。主要对象被命名为“packet”,其类型为“PacketPokerTableList”,并且嵌套对象被命名为“packet”,其中每个子包在具有“PacketPokerTable”类型的包中。数据包中可以有任意数量的子数据包,它们会根据给定锦标赛中的表数量而有所不同。 “PacketPokerTable”类型的每个子包都包含许多元素,这些元素具有代表比赛中每个表的给定值。上面代码中的for循环只查看数据包中的第一个子包,并检索“id”的值,在本例中为97,然后通过调用server.tableJoin()显示该表。

我希望修改此默认行为,以便“for循环”在数据包类型“PacketPokerTableList”中循环遍历“PacketPokerTable”类型的所有子数据包,并从每个子数据包中检索“id”的值。 然后,而不是在当前页面的div中自动显示表格;我希望,对于每个表“id”,使用window.open()方法在新的浏览器窗口中显示其相关表。

我无法克服的第一个障碍是如何遍历这个复杂的对象并检索“id”的所有值。不确定是否可能。我在网上研究过的所有东西主要与具有非常基本数组的“for循环”有关;其中没有一个是有帮助的。第二个障碍是如何将此变量与在子窗口中执行的函数一起传递。

似乎解决这个我自己的问题远远超出了我的工作站,我非常感谢有关如何完成这项任务的任何意见。

2 个答案:

答案 0 :(得分:1)

要遍历每个元素,必须使用递归。我真的不明白你想做什么,但这是一个简单的例子:

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

答案 1 :(得分: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));
            }
        }
    }