在循环内调用函数会破坏它

时间:2015-11-21 23:28:17

标签: javascript node.js mongodb

我有一个从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;
}

2 个答案:

答案 0 :(得分:1)

当您调用removeConnection时,您正在修改正在迭代的集合。我冒昧地说,在第一个循环之后,connections.length小于循环控制变量,这将导致循环终止。函数调用后connections的内容是什么?

一般来说,直接修改你正在迭代的集合是不好的做法。更好的选择是将集合投影到一个包含所需值的新集合(使用map,filter等)。那样你就不会改变任何东西。

答案 1 :(得分:0)

通过在每个var上向i=0添加for来解决此问题。有人可以解释一下吗?

for(var i=0; i < connections.length; i++) {...