Найти ближайшую наименьшую дату в структуре JavaScript - PullRequest
0 голосов
/ 10 мая 2019

ТАК У меня проблема, и я не совсем уверен, как ее решить.Пытался найти ответ и нашел какой-то похожий вопрос, но ни один не помог мне.

В основном в javascript я получаю вложенную структуру, содержащую идентификаторы, содержащие одну или несколько дат, каждая дата содержит значение.

У меня есть идентификатор и произвольная дата, которая может не совпадатьте, которые доступны.То, что я пытаюсь сделать, это найти ближайшую наименьшую дату, соответствующую данному идентификатору.

Пример структуры:

ID123
    2007-09-02
        ACTIVATED
    2019-09-07
        INACTIVATED
    2019-09-09
        REACTIVATED

Учитывая идентификатор ID123 и дату 2019-08-01. Я хочу получить доступ к 2007-09-02, чтобы найти значение ACTIVATED.Лучшее, о чем я могу думать, - это какая-то форма функции сравнения.Кто-нибудь знает хороший способ сделать это?

1 Ответ

0 голосов
/ 10 мая 2019

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;
}

Объяснение :

Я создаю набор данных с двумя объектами с разными идентификаторами.Каждый из них имеет свой собственный массив данных с полем даты и значения.

Затем я создаю функцию, которая возвращает самое близкое наименьшее значение даты для данного идентификатора.

Сначала я упорядочиваю данные,а затем отфильтруйте записи с датой, которая следует за данной датой.

Если в этом массиве есть значения, я возвращаю последнюю запись, которая будет ближайшей наименьшей.

Если записей неттогда, по сути, это когда дата проходит раньше, чем любое из появлений даты, тогда она возвращает самую низкую дату из всего массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...