使用带通配符的数组在数组中有效地查找数组

时间:2017-02-19 00:24:08

标签: javascript arrays

我有以下形式的数组对象数组:

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

我经常以相同的格式([eventID,IP,timestamp])收到一个新的数组对象。

我需要检查主数组中是否存在具有相同eventID / IP对的现有对象(很可能),而不匹配时间戳。

显然我可以首先遍历列表检查eventID,然后是IP,但这似乎......不优雅。 我可以使用indexOf,但我不完全确定用于匹配数组中元素的数组中的通配符元素的语法。

搜索主阵列中[eventID,IP,WILDCARD]的最有效方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用两级键/值结构进行快速查找。传统上,人们会使用普通对象来做这件事,但是从ES6开始,建议使用Map个对象用于这种动态增长的结构。

例如,您可以使用一个对象作为具有2维(eventId和IP)的哈希,它使用嵌套的Map对象在内部公开get和set方法:

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