我有以下形式的数组对象数组:
[[eventID, IP, timestamp], [eventID, IP, timestamp]... ]
我经常以相同的格式([eventID,IP,timestamp])收到一个新的数组对象。
我需要检查主数组中是否存在具有相同eventID / IP对的现有对象(很可能),而不匹配时间戳。
显然我可以首先遍历列表检查eventID,然后是IP,但这似乎......不优雅。 我可以使用indexOf,但我不完全确定用于匹配数组中元素的数组中的通配符元素的语法。
搜索主阵列中[eventID,IP,WILDCARD]的最有效方法是什么?
答案 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