Фильтровать массив объектов по дате, превышающей дату. - PullRequest
1 голос
/ 26 июня 2019

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

Я пытался отфильтровать его, но он возвращает полный массив, и он не работал, как должно быть.

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

const menuItems = [{
    name: 'Hamburger',
    expirationDate: '09-24-2019'
  },
  {
    name: 'Chicken',
    expirationDate: '10-03-2019'
  },
  {
    name: 'Hot-Dog',
    expirationDate: '03-24-2019'
  },
];

let today = new Date();
let dd = today.getDate();
let mm = today.getMonth();
let yyyy = today.getFullYear();
if (dd < 10) {
  dd = '0' + dd;
}

if (mm < 10) {
  mm = '0' + mm;
}
today = mm + '-' + dd + '-' + yyyy;

console.log(today);

const filterByExpiration = (items) => {
  menuItems.filter(function() {
    return items.expirationDate > today;
  })
};

Ответы [ 4 ]

0 голосов
/ 26 июня 2019

Это делает лексикографическое сравнение - не то, что вы хотите. Просто сравните два Date вместе - и использование функции стрелки означает, что вы также можете получить неявный возврат

const menuItems = [{name:'Hamburger',expirationDate:'09-24-2019'},{name:'Pizza',expirationDate:'03-11-2019'},{name:'Sushi',expirationDate:'03-21-2019'},{name:'Chicken',expirationDate:'10-03-2019'},{name:'Steak',expirationDate:'05-27-2019'},{name:'Hot-Dog',expirationDate:'03-24-2019'}];
const today = new Date();
const filterByExpiration = arr => arr.filter(({ expirationDate }) => new Date(expirationDate.replace(/-/g, "/")) > today);
console.log(filterByExpiration(menuItems));
.as-console-wrapper { max-height: 100% !important; top: auto; }

replace - преобразование строк с датами в допустимые даты - не все браузеры поддерживают дефисные даты.

0 голосов
/ 26 июня 2019

Вы можете использовать Date.parse (date), чтобы получить метку времени переданных данных и отфильтровать их, если разница с текущей датой отрицательна.Ваш код должен выглядеть примерно так:

const menuItems = [
  {
    name: 'Hamburger',
    expirationDate: '09-24-2019'
  },
  {
    name: 'Chicken',
    expirationDate: '10-03-2019'
  },
  {
    name: 'Hot-Dog',
    expirationDate: '03-24-2019'
  },
];

function filterByExpiration (items) {
  let today = new Date();
  let dd = today.getDate();
  let mm = today.getMonth();
  let yyyy = today.getFullYear();
  if (dd < 10) {
    dd = '0' + dd;
  }
  if (mm < 10) {
    mm = '0' + mm;
  }
  today = mm + '-' + dd + '-' + yyyy;
  return menuItems.filter((item) => item.expirationDate > today)
};
0 голосов
/ 26 июня 2019

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

new Date(); //gives something like this Wed Jun 26 2019 02:55:59 GMT+0530

, и вы пытаетесь сравнить с '03 -24-2019 'что-то вроде этого.Возможный поток будет:

const menuItems = [{
    name: 'Hamburger',
    expirationDate: '09-24-2019'
  },
  {
    name: 'Chicken',
    expirationDate: '10-03-2019'
  },
  {
    name: 'Hot-Dog',
    expirationDate: '03-24-2019'
  },
];
const today = new Date().getTime();
const filterByExpiration = menuItems.filter((items)  => {
    return new Date(items.expirationDate).getTime() > today;
  })
console.log(filterByExpiration)
0 голосов
/ 26 июня 2019
const menuItems = [
  {
    name: 'Hamburger',
    expirationDate: '09-24-2019'
  },
  {
    name: 'Pizza',
    expirationDate: '03-11-2019'
  },
  {
    name: 'Sushi',
    expirationDate: '03-21-2019'
  },
  {
    name: 'Chicken',
    expirationDate: '10-03-2019'
  },
  {
    name: 'Steak',
    expirationDate: '05-27-2019'
  },
  {
    name: 'Hot-Dog',
    expirationDate: '03-24-2019'
  },
];


const filterByExpiration = () => {
  const Today = Date.now()
  return menuItems.filter(function (item) {
    return new Date(item.expirationDate).getTime() > Today;
  });
};

filterByExpiration();

Подробнее о фильтр

Для старых браузеров

var filterByExpiration = () => {
  var Today = new Date(); 
  return menuItems.filter(function (item) {
    var year = Today.getFullYear();
    var month = Today.getMonth()+1;
    var day = Today.getDay();
    var dateYearArray = item.expirationDate.split('-');
    var dateYear = dateYearArray[2];
    var dateMonth = dateYearArray[0];
    var dateDay = dateYearArray[1];
    var isYear = year > dateYear;
    var isMonth = month > dateMonth;
    var isDay = day > dateDay;
    return !(isYear || isMonth || isDay);
  });
};


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