2017-03-09 5 views
0

混乱するタイトルは申し訳ありません。リストから自分自身を除外して各プレイヤーにリストを送信する方法

['Peter','James','Susan','Thomas']という配列を持っていて、array.length個の新しい配列(この場合は4個)を取得したい場合は、新しい配列の名前のそれぞれが元の配列の名前よりも少なくなります。

それでは、私が欲しいのは、この4つの配列である:

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

そして、私はその名前がない人にはそれぞれの新しい配列を送信したい場合。 (だから私は、ジェームズ['Peter','Susan','Thomas']にピーター['James','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()修正です。最初のコピーを作成する必要があります。オリジナルを破棄しないようにする必要があります。.splicenewArrayに割り当てないでください。変更された配列ではなく削除された要素の配列が返されるためです。

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を使用して、を実行する前にarrayのコピーをArray#sliceにして、元の配列が反復するたびに破損しないようにしてください。

// 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) 
 
})

関連する問題