2017-02-19 12 views
0

ワイルドカードとアレイと、アレイ内の配列を見つけますイベントID、IP、タイムスタンプ])。は効率的に、私は次の形式で配列オブジェクトの配列を有する

タイムスタンプを一致させずに、同じイベントID/IPペア(かなり可能性があります)を持つ既存のオブジェクトのメイン配列をチェックする必要があります。

明らかに、私は最初にeventIDをチェックしてからIPをチェックすることができますが、これはやや控えめです。 私はindexOfを使うことができましたが、配列内の要素を一致させるために使用される配列内のワイルドカード要素の構文は完全にはわかりません。

[eventID、IP、WILDCARD]のメイン配列を検索する最も効率的な方法は何でしょうか?

+0

:あなたは、例えば内部にネストされたMapオブジェクトを使用して、取得および設定メソッドを公開して2次元(イベントIDとIP)とのハッシュとして機能するオブジェクトを使用することができ

これはあなたが一度だけ、または何度もやる検索ですか? – trincot

+0

何度も。新しいイベントID/IPペアがあると、メインアレイが大きくなります。 eventID/IPペアが存在すると、タイムスタンプが更新されます。 – Squidinker

+0

配列でなければならないのか、検索を高速化できる構造を提案できますか?また、いくつかのサンプルデータを提供できますか? – trincot

答えて

1

高速ルックアップのために2レベルのキー/値構造を使用できます。伝統的には単純なオブジェクトでこれを行いますが、ES6以来、このような動的に成長する構造にはMapオブジェクトを使用することをお勧めします。

function EventHash() { 
 
    var hash = new Map; 
 
    
 
    this.set = function (eventId, IP, timestamp) { 
 
     if (!hash.has(eventId)) hash.set(eventId, new Map); 
 
     hash.get(eventId).set(IP, timestamp); 
 
     return this; 
 
    }; 
 
    this.get = function (eventId, IP) { 
 
     if (hash.has(eventId)) return hash.get(eventId).get(IP); 
 
    } 
 
} 
 

 
// Demo 
 
var hash = new EventHash(); 
 

 
hash.set(1, '123.123.123.123', 11111); 
 
hash.set(1, '555.555.555.555', 22222); 
 
hash.set(2, '555.555.555.555', 33333); 
 
console.log(hash.get(1, '123.123.123.123')); // 1111 
 
hash.set(1, '123.123.123.123', 44444); 
 
console.log(hash.get(1, '123.123.123.123')); // 4444 
 
console.log(hash.get(5, '123.123.123.123')); // does not exist 
 
console.log(hash.get(1, '')); // does not exist

+0

それで2分の時間がかかりました。非常にまともな気分になります。素晴らしいもの、ありがとう! – Squidinker

関連する問題