2017-02-19 45 views
0

我有陣列的對象的以下形式的數組:高效找到一個陣列內的陣列與陣列與一個通配符

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

每隔一段時間我接收在同一格式的新陣列的對象([ eventID,IP,時間戳])。

我需要檢查具有相同eventID/IP對(很可能)的現有對象的主數組,而不匹配時間戳。

很明顯,我可以遍歷列表首先檢查eventID,然後爲IP,但這似乎...不雅。 我可以使用indexOf,但我不完全確定用於匹配數組中元素的數組中的通配符元素的語法。

搜索[eventID,IP,WILDCARD]主陣列的最有效方法是什麼?

+0

這是一個搜索,你只會做一次,或多次? – trincot

+0

很多次。有一個新的eventID/IP對時,主陣列將會增長。當eventID/IP對存在時,時間戳將被更新。 – Squidinker

+0

它是否必須是一個數組,或者我們能否提出一個允許更快搜索的結構?另外,你能否提供一些示例數據? – trincot

回答

1

您可以使用兩級鍵/值結構進行快速查找。傳統上,人們會使用普通對象來做到這一點,但自ES6以來,建議使用Map對象來處理這種動態生長的結構。

您可以例如使用一個用作與2個維(事件ID和IP)的哈希,暴露get和set方法,在內部使用嵌套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