Код, который вы выбрали, не подходит по той причине, о которой вы заявляете, и ваше решение может быть намного проще. Вы хотите найти последнюю дату, которая предшествует вашей дате, поэтому просто вычтите каждую дату из контрольной даты, а когда результат будет 0 или отрицательным, вам нужна предыдущая дата.
Вам также следует иметь дело с выходящими за пределы значениями, например, до начала или после конца. Я угадал, что вы хотите в этих случаях, вам нужно подумать, что нужно сделать, и настроить лог c в соответствии.
Например
// Get last element of arr that is before d
function getPrevious(d, arr) {
let i = 0;
while (d - arr[i] > 0 && i < arr.length - 1) {
i++;
}
return i == 0? void 0 : arr[--i] ;
}
// Sample data
let dates = [
new Date(2020, 1, 10), // 2020-02-10
new Date(2020, 1, 13), // 2020-02-13
new Date(2020, 1, 16), // 2020-02-16
new Date(2020, 1, 19) // 2020-02-19
];
// Test dates
[new Date(2020, 1, 8), // 2020-02-08 -> before start -> undefined
new Date(2020, 1, 12), // 2020-02-12 -> within range -> 10 Feb
new Date(2020, 2, 12) // 2020-03-12 -> after end -> last date
].forEach(d => {
let result = getPrevious(d, dates);
console.log(`${d.toDateString()} -> ${result? result.toDateString() : result}`)
});