Показать сообщение отдельно
  #38 (permalink)  
Старый 07.03.2019, 09:36
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

рони, чтение структуры (с мемоизацией):
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);
});
Ответить с цитированием