JSFiddle с примерами вашего набора данных: https://jsfiddle.net/esaqz9n3/2/
Код :
var arrayOfData = [
{
id: 123,
data: [
{
date: '2019-09-07',
value: "123 - middle date"
},
{
date: '2019-09-09',
value: "123 - latest date"
},
{
date: '2007-09-02',
value: "123 - earliest date"
}]
},
{
id: 234,
data: [
{
date: '2008-07-08',
value: "234 - earliest date"
},
{
date: '2009-06-02',
value: "234 - middle date"
},
{
date: '2009-07-03',
value: "234 - latest date"
}]
}
];
var value = getClosetLowestDateValue(123, '2010-05-01');
console.log(value);
value = getClosetLowestDateValue(123, '2001-05-01');
console.log(value);
value = getClosetLowestDateValue(123, '2019-09-08');
console.log(value);
value = getClosetLowestDateValue(234, '2009-06-28');
console.log(value);
value = getClosetLowestDateValue(234, '2001-05-01');
console.log(value);
value = getClosetLowestDateValue(234, '2020-05-01');
console.log(value);
function getClosetLowestDateValue(id, date) {
var obj = arrayOfData.find(function(a) { return a.id == id });
var orderedData = obj.data.sort(function(a,b) {
return new Date(a.date) - new Date(b.date);
});
var dataWithoutDatesAfterDate = orderedData.filter(function (d){
return new Date(d.date) <= new Date(date);
});
if(dataWithoutDatesAfterDate.length > 0) {
return dataWithoutDatesAfterDate[dataWithoutDatesAfterDate.length - 1].value;
}
return orderedData[0].value;
}
Объяснение :
Я создаю набор данных с двумя объектами с разными идентификаторами.Каждый из них имеет свой собственный массив данных с полем даты и значения.
Затем я создаю функцию, которая возвращает самое близкое наименьшее значение даты для данного идентификатора.
Сначала я упорядочиваю данные,а затем отфильтруйте записи с датой, которая следует за данной датой.
Если в этом массиве есть значения, я возвращаю последнюю запись, которая будет ближайшей наименьшей.
Если записей неттогда, по сути, это когда дата проходит раньше, чем любое из появлений даты, тогда она возвращает самую низкую дату из всего массива.