Как фильтровать большой массив на основе промежуточного значения в подмассиве? (Node.js )

#node.js #node-modules

#node.js #узел-модули

Вопрос:

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

Вот выдержка из примера записи:

 {"status":[
  {"date":{"$date":"2019-06-14T06:17:41.625Z"},"statusCode":200},
  {"date":{"$date":"2019-11-04T02:02:58.020Z"},"statusCode":404},
  {"date":{"$date":"2020-08-07T01:11:16.184Z"},"statusCode":200},
  {"date":{"$date":"2020-08-07T03:54:09.703Z"},"statusCode":404}
]}
  

Используя этот пример, статус 2020-01-13 будет 404 (как и в 2020-01-12 или любом другом givenDate , пока статус не изменится обратно на 200 ).

Итак, как мне отфильтровать мой большой массив для этой записи (и других подобных ей) только для элементов со статусом 404 по состоянию на 2020-01-13? (И я бы сделал то же самое для 200 .)

Обратите внимание, что я не могу просто фильтровать объекты с date < givenDate amp;amp; statusCode == 200 помощью, потому что это игнорировало бы, если бы статус изменился после этих записей. (Приведенный выше пример вернет либо 200 или 404 , поскольку обе записи существовали ранее givenDate .)

Моя единственная идея на данный момент заключается в том, что я мог бы сначала отфильтровать status массив по чему-либо ранее givenDate , а затем сравнить на основе последней записи (поскольку последняя запись этого отфильтрованного массива всегда будет перед givenDate ). Но это кажется более сложным, чем необходимо.

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

Заранее спасибо!

Ответ №1:

Немного многословно, но я думаю, это должно делать то, что вы хотите.

 var feedHistory = {"status":[
  {"date":{"$date":"2019-06-14T06:17:41.625Z"},"statusCode":200},
  {"date":{"$date":"2019-11-04T02:02:58.020Z"},"statusCode":404},
  {"date":{"$date":"2020-08-07T01:11:16.184Z"},"statusCode":200},
  {"date":{"$date":"2020-08-07T03:54:09.703Z"},"statusCode":404}
]};

const filterByStatus = (feedHistory,statusDate) => {
    let foundRecord = false;
    feedHistory.forEach((record) => {
        let recordDate = new Date(Date.parse(record.date['$date']));
        
        if (recordDate < statusDate amp;amp; (!foundRecord || foundRecord.parsedDate < recordDate)) {
            record.parsedDate = recordDate;
            foundRecord = record;
        }
    });
    return foundRecord;
};

var statusDate = new Date('2019-06-15');

var statusOnDate = filterByStatus(feedHistory.status,statusDate);
console.log(`On ${statusDate} the status was ${statusOnDate.statusCode}`);  

Комментарии:

1. Спасибо! К сожалению, это, похоже, переносит статус first found. Таким образом, любой statusDate вводимый мной возвращает 200, даже если после последнего статуса. Но я думаю, что это дает мне кое-что для небольшой работы.