我最近一直在教自己的Node.JS,这很有趣。然而,我遇到了一个真正在这里杀了我的路障。我已经意识到我无法绕过JS中的For循环。每当我使用for循环时,我最终只使用jquery $ .each()来饶了我的脑袋。好吧,我不能依靠。我正在尝试的东西,而我却试图绕过For循环。这是我正在与之合作的内容。
就某些情况而言,我一直在使用node.js中的websockets。其乐无穷!我从你到处找到的标准ChatApp开始,现在我正在尝试构建一个多人Tic-Tac-Toe游戏。当玩家点击网格时,网格选择存储在node.js websocket服务器上的玩家对象内的列表中。
我要做的最后一件事是将选择的板节点列表与可能的井字解决方案的主列表进行比较:
//i'm sure this can be formatted better....
var solutions = {
'vert':{
1:[[0,0],[0,1],[0,2]],
2:[[1,0],[1,1],[2,1]],
3:[[2,0],[2,1],[2,2]]
},
'hor':{
1:[[0,0],[1,0],[2,0]],
2:[[0,1],[1,1],[2,1]],
3:[[0,2],[1,2],[2,2]]
},
'diag':{
1:[[0,0],[1,1],[2,2]],
2:[[2,0],[1,1],[0,2]]
}
};
// player selected grid coordinates
var player1 = {
'picked':[[0,0],[1,1],[2,2]]
};
// the big dumb function that I hate.
function winCondition(solutions){
var win = '';
console.log('-------------------------------------------------------');
if(win === ''){
$.each(solutions, function(index, solution){
$.each(solution, function(index, winCon){
console.log('testing Win Condition ' + index,winCon);
matches = 0;
if(matches !== 3){
console.log('current match value = ' + matches);
$.each(winCon, function(index, gridSlot){
console.log('Testing ' + index,gridSlot);
$.each(player1.picked, function(index,gridChoice){
console.log('does '+ gridSlot + ' = ' + gridChoice);
if(gridSlot[0] == gridChoice[0] && gridSlot[1] == gridChoice[1]){
matches = matches + 1;
console.log('match! ' + matches + '/3 left');
if(matches == 3){
win = true;
}
}
});
});
}
});
});
}
if (win === true){
return true;
} else {
return false;
}
}
我在codepen中测试了一段时间,它看起来像我想要的那样工作,除了缺少.each服务器端!
那么我怎样才能获得相同的结果......每次看到一个for循环的例子,我的大脑都会向下看。我确定我已经把这整件事搞得一团糟了,但是现在我已经把这个问题搞砸了几个小时,我想我在脑子里的某个地方吹了一个电阻。
答案 0 :(得分:1)
有趣的是,作为最佳做法shouldn't be using a for...in loop on arrays,这可能会让您陷入困境。一个regular for loop is fine,但根据您的情况,我建议在数组本身上使用the .forEach()
method,如下所示:
var array = ['foo', 'bar', 'baz'];
array.forEach(function (element, index, array) {
console.log(element, index, array);
}
这是一个与jQuery .each()
非常相似的方法,它可以使转换更直接。