Как запросить метку времени для определенного дня или месяца на объекте? - PullRequest
0 голосов
/ 05 сентября 2018
var data = [
 {
   timestamp: "2018-09-05T13:56:48.034Z",
   id: 1
 },
 {
   timestamp: "2018-09-05T13:56:48.034Z",
   id: 2
 },
 {
   timestamp: "2018-09-05T13:56:48.034Z",
   id: 3
 }
]

data.filter((val) => {
 return val.timestamp.split("T")[0].split("-")[1] == "09"
})

Это то, что я смог придумать из-за некоторых комментариев, дающих мне другую точку зрения. Я чувствую, что есть способ сделать это с объектом Date. Пожалуйста, дайте мне знать, если это возможно? Спасибо!

1 Ответ

0 голосов
/ 05 сентября 2018

const data = [
  { timestamp: "2018-09-05T13:56:48.034Z", id: 1 },
  { timestamp: "2018-02-05T13:56:48.034Z", id: 2 },
  { timestamp: "2018-09-05T13:56:48.034Z", id: 3 },
  { timestamp: "2018-04-05T13:56:48.034Z", id: 4 },
  { timestamp: "2018-09-07T13:56:48.034Z", id: 5 }
];

/**
 * The filter object can be used to specify which items to return. Any optional
 * property which is set to null or undefined will not cause any items to be 
 * excluded from the result set. When multiple properties are set only items 
 * which match all the filter settings will be returned.
 *
 * @typedef {Object} Filter
 * 
 * @property {Number} [month] This optional property can be used to return only
 *           items with a timestamp for the specified month. The value should be
 *           between 1 (January) and 12 (December)
 * @property {Number} [date] This optional property can be used to return only
 *           items with a timespamt for the specified day of the month.
 */

/**
 * Returns only the items whose timestamp property match the provided filter.
 *
 * @param {Array<Object>} items The array of items to be filtered.
 * @param {Filter} filter The filter objects controls which items will be returned.
 *        only items whose timestamp matches all the filter fields will be returned.
 *
 * @returns {Array<Object>} The result is an array with items whose timestamp
 *          property matched the filter. When no items matched the filter the result
 *          will be an empty array.
 */
function filterByTimestamp(items, filter) {
  return items.filter(item => {
    const
      // Convert the timestamp to a Date object
      date = new Date(item.timestamp),
      // Create an array with boolean values.
      matches = [
        // When filter has no month property or if it does and the 
        // value matches the month of the date object add a true.
        filter.month == undefined || date.getMonth() + 1 === filter.month,
        // When filter has no date property or if it does and the 
        // value matches the date of the date object add a true.        
        filter.date == undefined || date.getDate() === filter.date
      ];
      
      // The current item matches the filter when all the entries in
      // the array are true.
      return matches.every(value => value);
  });
}

console.log('All the items in September (should be 3):');
console.log(filterByTimestamp(data, {month: 9}));
console.log('All the items on September 5th (should be 2):');
console.log(filterByTimestamp(data, {month: 9, date: 5}));
console.log('All the items on a 7th (should be 1):');
console.log(filterByTimestamp(data, {date: 7}));

В приведенном выше фрагменте показана настройка, которая позволит вам фильтровать только по месяцам, по дням или по месяцам / дням. Расширение этого также для обработки других частей временной метки должно быть довольно тривиальным.

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