socketio array.splice 如果 make console.log 不工作

socketio array.splice dont work if make console.log

奇怪的现象。套接字

服务器

我有那个代码...

socket.on('disconnect', function(){

    console.log('user disconnected');

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

        var c = stores[i];

        if(c.socketid == socket.id){

            stores.splice(i,1);
            break;
        }
    }

});

.splice 一切顺利。如果我从其他地方打印 stores 数组,它显示正确...但在这种情况下

    socket.on('disconnect', function(){

            console.log('user disconnected');

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

                var c = stores[i];

                if(c.socketid == socket.id){

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

                        console.log(i+" one"+stores[i].name+"-"+stores[i].id)

                     }

                    stores.splice(i,1);

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

                        console.log(i+" two"+stores[i].name+"-"+stores[i].id)

                     }

                    break;
                }
            }
    });

数组没有丢失它的值,我从我的浏览器访问页面(我已连接),

socket.on('storelogged', function (msg){

        var storeInfo = new Object();
        storeInfo.name      = msg.name;
        storeInfo.id         = msg.id;
        storeInfo.socketid     = socket.id;
        stores.push(storeInfo);

        console.log(msg.name + " has connected with " + msg.id + " id." );

});

因此,商店 已推送。但是当我在 socket.on('disconnect',callback) 的第二种情况下断开连接时,stores 数组仍然包含值(换句话说,拼接不起作用)

评论提供更多更好的信息。你也可以测试一下看看结果

您的嵌入式 for 循环正在覆盖顶级 for 循环中的 i 变量。

对所有 for 循环使用 let 而不是 for (let i = 0; ....) 中的 var,这样每个循环都有不同的局部范围值 i 和内部循环不会覆盖外部循环或为嵌入式 for 循环使用不同的变量名称或使用 .forEach() 为索引创建新变量。

此外,在您正在迭代的数组上调用 .splice() 之后,您已经从 for 循环中递减当前数组索引,否则您将跳过查看数组,因为 .splice() 将其向下移动到您刚刚删除的索引位置,并且您的 for 循环已经迭代。

例如,您可以像这样更改内部 for 循环的变量名称:

socket.on('disconnect', function () {
    console.log('user disconnected');
    for (var i = 0; i < stores.length; i++) {
        var c = stores[i];

        if (c.socketid == socket.id) {
            for (var j = 0; j < stores.length; j++) {
                console.log(j + " one" + stores[j].name + "-" + stores[j].id)
            }
            stores.splice(i, 1);
            // make sure not to skip the value we just moved into the i slot in the array
            i--;    
            for (var k = 0; i < stores.length; k++) {
                console.log(k + " two" + stores[k].name + "-" + stores[k].id)
            }
            break;
        }
    }
});

或者,您可以将 let 用于 for 循环:

socket.on('disconnect', function () {
    console.log('user disconnected');
    for (var i = 0; i < stores.length; i++) {
        var c = stores[i];

        if (c.socketid == socket.id) {
            for (let i = 0; i < stores.length; i++) {
                console.log(i + " one" + stores[i].name + "-" + stores[i].id)
            }
            stores.splice(i, 1);
            // make sure not to skip the value we just moved into the i slot in the array
            i--;
            for (let i = 0; i < stores.length; i++) {
                console.log(i + " two" + stores[i].name + "-" + stores[i].id)
            }
            break;
        }
    }
});

或者,您可以使用 .forEach():

socket.on('disconnect', function () {
    console.log('user disconnected');
    for (var i = 0; i < stores.length; i++) {
        var c = stores[i];

        if (c.socketid == socket.id) {
            stores.forEach(function(item, index) {
                console.log(index + " one" + item.name + "-" + item.id)
            });
            stores.splice(i, 1);
            // make sure not to skip the value we just moved into the i slot in the array
            i--;
            stores.forEach(function(item, index) {
                console.log(index + " one" + item.name + "-" + item.id)
            });
            break;
        }
    }
});