17

私はチャットに取り組んでおり、配列を使用してユーザーを保持しています。これが私の問題です:

User1 が参加し、プッシュによって配列にインデックス 0 が与えられます。User2 が参加し、プッシュによって配列内のインデックス 1 が与えられます。

User1 は切断され、スプライスによって削除されます。

NOW User2 は Index 0 になります。

User1 が再接続し、プッシュによってインデックス 1 が与えられます。

User2 が切断され、現在 User1 である Index 1 が削除されます。

これはもちろん問題を引き起こしています。

だから私の質問は、他の要素のインデックスを変更せずに配列からアイテムを削除するにはどうすればよいですか? 私はここで間違った道を進んでいますか?

4

5 に答える 5

16

で配列からアイテムを削除する代わりにsplice()、値をnullまたはに設定してみませんかundefined?

次に、新しいユーザーを追加するときに、アレイをスキャンして最初に使用可能なスロットを見つけることができます。

JavaScript 配列は単なる項目のリストです。PHP でおなじみのように、特定のキーにキー付けされているわけではありません。したがって、配列内で同じ位置を保持したい場合は、他の項目を削除することはできません。それらを保持する必要があり、それらを空としてマークするだけです。


次のようなものをスキャンできます。

var users = [];
function addUser(user) {
    var id = users.indexOf(null);
    if (id > -1) {
        // found an empty slot - use that
        users[id] = user;
        return id;
    } else {
        // no empty slots found, add to the end and return the index
        users.push(user);
        return users.length - 1;
    }
}
function removeUser(id) {
    users[id] = null;
}
于 2013-06-30T05:56:12.083 に答える
6

もう 1 つのオプションは、配列の代わりに JavaScript オブジェクトを使用することです。

このようなもの:

var users = {};

users[1] = 'user 1';
users[2] = 'user 2';

delete users[1];
alert(users[2]);        // alerts "user 2"
alert(typeof users[1]); // alerts "undefined"

ただし、配列プロパティは失われるlengthため、最大ユーザー数を自分で追跡する必要があります。

于 2013-06-30T06:04:22.743 に答える