рони, чтение структуры (с мемоизацией):
var src = [
[[2018], [2], [20], ['Event 1 (2018.02.20)', 'Event 2 (2018.02.20)']],
[[2010, 2020], [7], [15], ['Event 3 (2010-2020.07.15)']],
[[2015, 2017], [2, 4], [25], ['Event 4 (2015-2017.02-04.25)']],
[[2006, 2008], [8, 10], [2, 6], ['Event 5 (2006-2008.08-10.02-06)']],
[[2000, 2001], [5, 6], [10, 11], ['Event 6 (2000-2001.05-06.10-11)']],
];
var db = {
data: src,
cache: {},
read: function (y, m, d) {
var key = y + '.' + m + '.' + d, event = this.cache[key];
if (event !== undefined) return event;
var event = null, data = this.data;
top: for (var i = 0; i < data.length; i++) {
var list = data[i];
for (var j = 0; j <= 3; j++) {
var item = list[j];
var date = arguments[j];
if (j == 3) {
event = item;
break top;
} else if (date < item[0] || (item.length == 1 ? date > item[0] : date > item[1])) {
break;
}
}
}
this.cache[key] = event;
return event;
}
};
// true dates tests
function D(y, m, d) {
this.y = y;
this.m = m;
this.d = d;
};
var dates = [
// 2018.02.20
new D(2018, 02, 20),
// 2010-2020.07.15
new D(2010, 07, 15), new D(2020, 07, 15), new D(2011, 07, 15),
// 2015-2017.02-04.25
new D(2015, 02, 25), new D(2017, 02, 25), new D(2016, 02, 25),
new D(2015, 04, 25), new D(2017, 04, 25), new D(2016, 04, 25),
new D(2015, 03, 25), new D(2017, 03, 25), new D(2016, 03, 25),
// 2006-2008.08-10.02-06
new D(2006, 08, 02), new D(2008, 08, 02), new D(2007, 08, 02),
new D(2006, 10, 02), new D(2008, 10, 02), new D(2007, 10, 02),
new D(2006, 09, 02), new D(2008, 09, 02), new D(2007, 09, 02),
new D(2006, 08, 06), new D(2008, 08, 06), new D(2007, 08, 06),
new D(2006, 10, 06), new D(2008, 10, 06), new D(2007, 10, 06),
new D(2006, 09, 06), new D(2008, 09, 06), new D(2007, 09, 06),
new D(2006, 08, 03), new D(2008, 08, 03), new D(2007, 08, 03),
new D(2006, 10, 03), new D(2008, 10, 03), new D(2007, 10, 03),
new D(2006, 09, 03), new D(2008, 09, 03), new D(2007, 09, 03),
// 2000-2001.05-06.10-11
new D(2000, 05, 10), new D(2001, 05, 10),
new D(2000, 06, 10), new D(2001, 06, 10),
new D(2000, 05, 11), new D(2001, 05, 11),
new D(2000, 06, 11), new D(2001, 06, 11),
];
dates.forEach(function (date, i) {
var event = db.read(date.y, date.m, date.d);
console.log(i, date, event);
});
Object.keys(db.cache).forEach(function (date, i) {
var event = db.cache[date];
console.log(i, date, event);
});