Фильтрация объектов по годам в Javascript - PullRequest
1 голос
/ 15 марта 2020

Недавно я отсортировал массив объектов по датам в порядке возрастания, не включая пустые строки / undefined. У меня возникли проблемы при создании фильтра, который будет фильтровать этот массив от определенного c года к другому.

Например: у меня есть массив с именем:

var activities = [
  { "title": 'Hiking', "date": '06/28/2012' },
  { "title": 'Shopping', "date": '01/18/2013' },
  { "title": 'Trekking', "date": '02/21/2013' },
  { "title": 'Sleeping', "date": '11/28/2013' },
  { "title": 'Driving', "date": ' ' },
  { "title": 'Running', "date": ' ' },
  { "title": 'Eating', "date": '12/31/2013' },
  { "title": 'Cooking', "date": '11/28/2014' },
  { "title": 'Excersise', "date": '02/21/2014' },
  { "title": 'Sking', "date": '04/04/2014' },
  { "title": 'Travelling', "date": '08/28/2018' }
]

Я хочу отфильтровать даты по годам 2012-2013. Таким образом, результат будет:

  { "title": 'Hiking', "date": '06/28/2012' }
  { "title": 'Shopping', "date": '01/18/2013' }
  { "title": 'Trekking', "date": '02/21/2013' }
  { "title": 'Sleeping', "date": '11/28/2013' }
  { "title": 'Eating', "date": '12/31/2013' }

Я сделал попытку, но я застрял на том, что делать.

var activities = [
  { "title": 'Hiking', "date": '06/28/2012' },
  { "title": 'Shopping', "date": '01/18/2013' },
  { "title": 'Trekking', "date": '02/21/2013' },
  { "title": 'Sleeping', "date": '11/28/2013' },
  { "title": 'Driving', "date": ' ' },
  { "title": 'Running', "date": ' ' },
  { "title": 'Eating', "date": '12/31/2013' },
  { "title": 'Cooking', "date": '11/28/2014' },
  { "title": 'Excersise', "date": '02/21/2014' },
  { "title": 'Sking', "date": '04/04/2014' },
  { "title": 'Travelling', "date": '08/28/2018' }
]

var activitiesData= activities
    .filter(d => d.date&& d.date!== ' ')
    .map(({ title, date }) => ({title, date}))
    .sort((a, b) => new Date(a.date) - new Date(b.date));

console.log(activitiesData)
    

Ответы [ 3 ]

3 голосов
/ 15 марта 2020

Вам необходимо проверить год, нарезав (String#slice) строку для получения последних четырех символов.

var activities = [{ title: 'Hiking', date: '06/28/2012' }, { title: 'Shopping', date: '01/18/2013' }, { title: 'Trekking', date: '02/21/2013' }, { title: 'Sleeping', date: '11/28/2013' }, { title: 'Driving', date: ' ' }, { title: 'Running', date: ' ' }, { title: 'Eating', date: '12/31/2013' }, { title: 'Cooking', date: '11/28/2014' }, { title: 'Excersise', date: '02/21/2014' }, { title: 'Sking', date: '04/04/2014' }, { title: 'Travelling', date: '08/28/2018' }],
    result = activities.filter(({ date }) =>
        2012 <= +date.slice(-4) && +date.slice(-4) <= 2013
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 15 марта 2020

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

var activities = [
  { "title": 'Hiking', "date": '06/28/2012' },
  { "title": 'Shopping', "date": '01/18/2013' },
  { "title": 'Trekking', "date": '02/21/2013' },
  { "title": 'Sleeping', "date": '11/28/2013' },
  { "title": 'Driving', "date": ' ' },
  { "title": 'Running', "date": ' ' },
  { "title": 'Eating', "date": '12/31/2013' },
  { "title": 'Cooking', "date": '11/28/2014' },
  { "title": 'Excersise', "date": '02/21/2014' },
  { "title": 'Sking', "date": '04/04/2014' },
  { "title": 'Travelling', "date": '08/28/2018' }
]

const getActivitiesByYear = (fromYear, toYear) => activities
  .filter(({
    date
  }) => {
    // get year from date
    let [year] = (date || '').match(/\d{4}/g) || [];
    // convert to number
    year = +year;

    /**
      1. checks if year is valid
      2. if fromYear is not specified returns true, otherwise checks if year is greater than or equal fromYear
      3. if toYear is not specified returns true, otherwise checks if year is less than or equal toYear
    */
    return year && (!fromYear || year >= fromYear) && (!toYear || year <= toYear);
  });

// example
console.log('From: 2012, To: 2013 ==>', getActivitiesByYear(2012, 2013));
console.log('From: 2013 ==>', getActivitiesByYear(2013));
0 голосов
/ 15 марта 2020

Извлечение лет из строки даты с ломтиком. Затем вы можете передать столько лет в массиве лет.

var activities = [
  { "title": 'Hiking', "date": '06/28/2012' },
  { "title": 'Shopping', "date": '01/18/2013' },
  { "title": 'Trekking', "date": '02/21/2013' },
  { "title": 'Sleeping', "date": '11/28/2013' },
  { "title": 'Driving', "date": ' ' },
  { "title": 'Running', "date": ' ' },
  { "title": 'Eating', "date": '12/31/2013' },
  { "title": 'Cooking', "date": '11/28/2014' },
  { "title": 'Excersise', "date": '02/21/2014' },
  { "title": 'Sking', "date": '04/04/2014' },
  { "title": 'Travelling', "date": '08/28/2018' }
]


const filterYear =(arr,years)=>{
 const activitiesByYear = arr.filter(({date})=> [...years].includes(date.slice(-4)))
 return activitiesByYear 
}

console.log(filterYear(activities, ['2012','2013']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...