2016-08-05 4 views
2

特定のIDを持つ配列内のオブジェクトを見つけるルックアップ関数を持つか、配列内の穴を持つinループのためだけに使う?ルックアップ関数またはinループ用?

私の状況では、ダイナミックなプレーヤーの配列があります。のは、私の配列は次のようになりますので、3人の選手が接続されているとしましょう:

players = [player1, player2, player3] 

ID 2人のプレーヤーの配列にして順に第三であると私はそのプレイヤーを知っているだろうプレイヤーIDとして配列のキーを維持するのは簡単だろう彼にアクセスし、私はちょうど使用する必要があります:players[2]をしかし第二プレイヤーが離れると、彼は、配列の穴を作成:

players = [player1,,player3] 

を私は理解してこの穴は、私が使用しているため、アレイを使用してのパフォーマンスが低下し-ためのループ多くの場合、プレーヤーオブジェクトの配列を持つ方がいいですし、配列の穴を残す代わりに穴をスプライスするだけですか?しかし、この方法では配列キーをプレーヤーIDとして保持できないため、ID検索機能を使用する必要があります。だから最終的にこれらの2つの選択肢のどれがパフォーマンスのために良いですか?それともこの問題を解決するためのより良い方法がありますか?

ありがとうございました!

+1

2(または200または2000)の要素の配列に関しては、それは本当に重要ではありません。 – zerkms

+3

プロパティキーがプレーヤーIDであるところの –

+8

のjavascriptオブジェクトを使用しない理由 "プログラマーは、プログラムの重要ではない部分のスピードを考えたり心配したりするために膨大な時間を無駄にします。デバッグやメンテナンス時のインパクトを考慮する必要があります。時間の約97%という小規模な効率性を忘れるべきです。早すぎる最適化はすべての悪の根源ですが、重要な3%で機会を逃してはいけません。 "Donald Knuth –

答えて

1

私の意見では、「ホールインプリメンテーション」が遅くなり、特にプレーヤーの配列を反復するときに、@ジャロマンダXがコメントに記載したオプションが最適です。プレーヤーは矢印が大きくなり、主に穴からなる非常にまばらになります。ルックアップを使用すると、すべてのインデックス削除プレーヤー後更新しなければならないので、最初私は、これは簡単かもしれないと思ったが、実際にこのコードは失敗し、このような良いアイデアではありません、なぜここ

var players = {}; 
players[p.id] = p; // add player p 
delete players[p.id]; // remove player p 
// player ids have to be unique and should be strings 

は...プレイヤーオブジェクトでもっとうまく行く。

// ATTENTION: example of FAILING implementation 
var players = []; 
var map = {}; 
// add player p 
var idx = players.push(p) - 1; 
map[p.id] = idx; 
// remove player p 
players.splice(map[p.id], 1); 
delete map[p.id]; 
+0

メモリリーク?どのように? – Bergi

+0

プレイヤーの追加と削除を続けても、アレイは非常に希薄になります。 – maraca

+1

これはメモリリークではありません(同じ方法 'window.foo = 'bar';'はメモリリークではありません)。 JSでメモリリークを起こすことはできません(実装にバグがない限り)。あなたが参照するものは、非効率的なメモリ使用です。 – zerkms

0

使用

var players = { 
    abc1: player1, 
    abc2: player2, 
    abc3: player3 
} 

代わりのvar players = [player1, player2, player3]

今、あなたが必要なplayers.abc1.name = "Nicholas"ノールックアップ機能を経由してアクセスすることができます。あなたが唯一の組織的な方法で、各プレーヤーをルックアップするためにIDのを使用して、私も単純なアプローチをお勧めしている場合:

var players = { 
    player1: player1, 
    player2: player2, 
    player3: player3 
} 

この道を、あなたはplayers.player1[madeUpPropName] = someValueのように、より簡単にアクセスすることができました。

また、アレイのfor-inループは決して私たちにはありません。 forEachまたは基本forループを使用します。 Why is using "for...in" with array iteration a bad idea?

0

あなたは簡単にconsole.time(str)console.timeEnd(str)を使用してパフォーマンスを自分でチェックすることができます。

var array = ['player1', 'player2', 'player3']; 

// Test using indexOf 
console.time('test1'); 
var val = array.indexOf('player3'); 
console.timeEnd('test1'); 

// Test using a for loop 
console.time('test2'); 
for (var i in array) { 
    if (i == 'player3') { 
     break; 
    } 
} 
console.timeEnd('test2'); 

注意をどのようにtimeの文字列と一致timeEnd:次の例を使用して、それを確認してください。

関連する問題