[英]How to loop through and extract property values from a complex object (Array)?
以下代码片段来自用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”,嵌套对象被命名为“ packets”,每个子包中的子包的类型为“ PacketPokerTable”。 数据包中可以有任意数量的子数据包,它们取决于给定锦标赛中的表数。 类型为“ PacketPokerTable”的每个子包都包含许多具有给定值的元素,这些值代表锦标赛中的每个表。 上面代码中的for循环仅查看数据包中的第一个子数据包,并检索“ id”的值(在这种情况下为97),然后通过调用server.tableJoin()显示表。
我希望修改此默认行为,以便“ for循环”在数据包类型“ PacketPokerTableList”内的所有“ PacketPokerTable”类型的子数据包之间循环,并从每个子数据包中检索“ id”的值。 然后,而不是自动在当前页面的div中显示表格; 我希望对于每个表“ id”,使用window.open()方法在新的浏览器窗口中显示其相关表。
我无法克服的第一个问题是如何遍历此复杂对象并检索“ id”的所有值。 不知道是否可能。 我在网络上研究的所有内容大多与具有基本数组的“ for循环”有关。 其中没有一个有帮助。 第二个障碍是如何将此变量与在子窗口中执行的函数一起传递。
看来自己解决这个问题是我的职责所在,我非常感谢您提供有关如何完成此任务的任何意见。
要遍历每个元素,必须使用递归。 我不太了解您要做什么,但是这里有一个简单的示例:
function loop(obj) {
if(obj.someprop == 'someval') {
//do something
} else {
loop(obj);
}
}
我不完全知道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));
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.