2017-02-19 6 views
0

ich ein Array von Array-Objekten in der folgenden Form habe:Effizientes ein Array innerhalb eines Array mit einem Array mit einem Platzhalter zu finden

[[eventID, IP, timestamp], [eventID, IP, timestamp]... ] 

Jedes so oft erhalte ich ein neues Array-Objekt im gleichen Format ([ eventID, IP, Zeitstempel]).

Ich muss das Haupt-Array für ein vorhandenes Objekt mit dem gleichen EventID/IP-Paar überprüfen (was sehr wahrscheinlich ist), ohne den Zeitstempel zu entsprechen.

Offensichtlich könnte ich durch die Liste iterieren zuerst für eventID, dann für IP, aber das scheint ... unelegant. Ich könnte indexOf verwenden, aber ich bin mir nicht ganz sicher über die Syntax für ein Platzhalterelement in einem Array, das Elemente in einem Array übereinstimmen.

Was wäre der effizienteste Weg, das Hauptfeld nach einer [eventID, IP, WILDCARD] zu durchsuchen?

+0

Ist das eine Suche, die du nur einmal oder mehrmals machen würdest? – trincot

+0

Viele Male. Das Haupt-Array wird wachsen, wenn ein neues eventID/IP-Paar vorhanden ist. Wenn das eventID/IP-Paar existiert, wird der Zeitstempel aktualisiert. – Squidinker

+0

Muss es ein Array sein, oder können wir eine Struktur vorschlagen, die schnellere Suchen ermöglicht? Könnten Sie auch einige Beispieldaten bereitstellen? – trincot

Antwort

1

Sie können eine zweistufige Schlüssel/Wert-Struktur für schnelles Nachschlagen verwenden. Traditionell würde man dies mit einfachen Objekten tun, aber seit ES6 wird empfohlen, Objekte mit Map für solche dynamisch wachsenden Strukturen zu verwenden.

Sie könnte zum Beispiel ein Objekt verwenden, die mit zwei Dimensionen (eventId und IP) als Hash handelt, welche Methoden erhalten und setzen aussetzt, intern verschachtelten Map Objekte mit:

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

Und das dauerte mich alle 2 Minuten zu implementieren. Fühlt sich auch sehr mager an. Tolles Zeug, danke! – Squidinker

Verwandte Themen