我有一个从MongoDB集合循环对象的函数。这是一些邮件运输岗位的所有可能的连接。一旦我得到一个连接,我想立即从连接对象中删除反向连接,例如,postA = 1和postB = 2,我想删除postA = 2和postB = 1(removeConnection
函数这样做)。
我无法理解为什么当我尝试在calculateRoute
内运行该函数时它只在控制台上返回一个'A',并在我删除它时返回三个'A'(它应该是什么) 。该功能以某种方式打破了循环。
calculatedRoutes = calculateRoute(store.postid, client.postid, connections, []);
function calculateRoute(actualPost, finalPost, connections, routes) {
for(i=0; i < connections.length; i++) {
if(actualPost == connections[i].postA) {
console.log('A');
// If I remove this, the console shows A three times. If I keep this, only shows 1 time.
connections = removeConnection(connections[i].postB, connections[i].postA, connections);
}
}
return routes;
}
function removeConnection(postA, postB, connections) {
for(i=0; i < connections.length; i++) {
if(connections[i].postA == postA && connections[i].postB == postB) {
delete connections[i];
//break;
}
}
return connections;
}
答案 0 :(得分:1)
当您调用removeConnection
时,您正在修改正在迭代的集合。我冒昧地说,在第一个循环之后,connections.length
小于循环控制变量,这将导致循环终止。函数调用后connections
的内容是什么?
一般来说,直接修改你正在迭代的集合是不好的做法。更好的选择是将集合投影到一个包含所需值的新集合(使用map,filter等)。那样你就不会改变任何东西。
答案 1 :(得分:0)
通过在每个var
上向i=0
添加for
来解决此问题。有人可以解释一下吗?
for(var i=0; i < connections.length; i++) {...