SERVER
我有那段代码......
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的一切顺利。如果我从其他地方打印商店数组,它显示正确...但在这种情况下
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 数组仍然包含值(换句话说,splice不起作用)
评论给予,更多和更好的信息。您也可以测试它并查看结果
答案 0 :(得分:1)
您的嵌入式for
循环会覆盖顶级i
循环中的for
变量。
对let
所有var
循环使用for (let i = 0; ....)
代替for
,因此每个循环都有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;
}
}
});