Вы можете применить бинарный поиск к вашему массиву. При условии, что ваш массив отсортирован. -> O(log(n))
[obj1,obj2,obj3....obj100]
проверить объект в середине (obj50)
, а затем решить, нужно ли искать в половине [obj1...obj49]
или в половине [obj51...obj100]
В противном случае вы можете передавать свои объекты (события) в другую структуру данных, например, в дерево. -> O(log(n))
Простой цикл по всему массиву будет неэффективным, но если вы не будете повторять его со слишком большим количеством, это также подойдет. Но лучшим вариантом будет сортировка массива с самого начала.
Редактировать: в следующем коде показан базовый c пример реализации двоичного поиска.
const events = [{
eventTitle: "Event title 1",
eventId: "xyz1@google.com",
startDate: "Sun Mar 18 00:00:00 GMT+01:00 2018",
endDate: "Mon Mar 19 00:00:00 GMT+01:00 2018"
},
{
eventTitle: "Event title 2",
eventId: "xyz2@google.com",
startDate: "Tue Mar 19 00:00:00 GMT+01:00 2019",
endDate: "Wed Mar 20 00:00:00 GMT+01:00 2019"
},
{
eventTitle: "Event title 3",
eventId: "xyz3@google.com",
startDate: "Fri Mar 20 00:00:00 GMT+01:00 2020",
endDate: "Sat Mar 21 00:00:00 GMT+01:00 2020"
},
{
eventTitle: "Event title 4",
eventId: "xyz4@google.com",
startDate: "Fri Mar 21 00:00:00 GMT+01:00 2021",
endDate: "Sat Mar 22 00:00:00 GMT+01:00 2021"
},
{
eventTitle: "Event title 5",
eventId: "xyz5@google.com",
startDate: "Fri Mar 22 00:00:00 GMT+01:00 2022",
endDate: "Sat Mar 23 00:00:00 GMT+01:00 2022"
}
];
function binarySearch(array, value, borderLeft, borderRight) {
if (borderLeft <= borderRight) {
var index = Math.floor((borderLeft + borderRight) / 2);
var number = getNumberFromTitle(array[index].eventTitle);
if (number == value) {
return array[index].startDate;
} else if (number > value) {
return binarySearch(array, value, borderLeft, index - 1);
} else {
return binarySearch(array, value, index + 1, borderRight);
}
} else {
return null;
}
}
function getNumberFromTitle(title) {
var tmp = title.split(" ");
return tmp[tmp.length - 1];
}
console.log(binarySearch(events, 4, 0, events.length - 1));