2017-04-12 24 views
0

奇怪的現象。 socketiosocketio array.splice不工作如果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順利。如果我從別的地方打印陣列,它顯示正確的...但在這種情況下

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."); 

}); 

so,店鋪推送。但是,當我在socket.on(「脫節」,回調)的第二種情況斷開陣列仍包含的值(換句話說,拼接不工作)給了,多和更好的信息

評論。您也可以測試它並查看結果

+0

您嵌入的'for'循環重寫'頂級'的''''''循環。或者在'for(let i = 0; ....)'中爲所有for循環使用'let'而不是'var',或者爲嵌入的'for'循環使用不同的變量名稱。 – jfriend00

回答

1

您的嵌入式for循環正在覆蓋頂級for循環中的i變量。

要麼使用let代替varfor (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; 
     } 
    } 
}); 

或者,你可以使用letfor循環:

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; 
     } 
    } 
}); 
+0

好吧,我明白了,它的作品,謝謝。 –