2017-03-09 30 views
0

對不起,標題很混亂。如何向每個玩家發送玩家列表,同時從列表中排除他們自己

如果我有一個數組作爲['Peter','James','Susan','Thomas']和我想獲得array.length數新陣列(在此情況下爲4),每個具有原始之一的一個不同少名新數組。

所以,我想這是什麼4個數組:

['James','Susan','Thomas'] 
['Peter','Susan','Thomas'] 
['Peter','James','Thomas'] 
['Peter','James','Susan'] 

如果我想發送的每個新的陣列,以人的姓名是不存在的。 (所以我想打發彼得['James','Susan','Thomas'],並詹姆斯['Peter','Susan','Thomas']

我當前的代碼是:

for(var i=0;i<array.length;i++){ 
    var player = array[i] 
    var newArray= array.splice(i,1) 
    io.to(player)emit('message', newArray) 
} 

返回數組只中有一個名字

回答

0

的問題是,array.splice()修改原始數組,因此您需要首先複製它,以免破壞原始數據,您也不應該將.splice指定爲newArray,因爲它返回的是已刪除元素的數組,而不是已修改的數組。

for (var i = 0; i < array.length; i++) { 
    var player = array[i]; 
    var newArray = array.slice(); 
    newArray.splice(i, 1); 
    io.to(player).emit('message', newArray); 
} 
0

Array#splice實際上會改變它被調用的數組。它可能會令人困惑的原因是它也返回一個包含剛剛刪除的元素的數組 - 因此您接收一個包含單個項目的數組。請嘗試使用Array#forEach,然後在運行splice之前使用Array#slice複製array,以便每次迭代都不會損壞原始數組。

// For demo purposes 
 
var io = { to: function(player) { return { emit: function(s, msg) { console.log(player, 'received', msg) } } } } 
 

 

 
var array = ['Peter', 'James', 'Susan', 'Thomas'] 
 

 
array.forEach(function(player, i, a) { 
 
    (a = a.slice()).splice(i, 1) 
 
    io.to(player).emit('message', a) 
 
})

相關問題