【问题标题】:Filter an array of objects by date that > than date.now按大于 date.now 的日期过滤对象数组
【发布时间】:2019-06-25 21:14:03
【问题描述】:

我在箭头函数和按日期值过滤对象数组时遇到了一些问题。

我尝试过滤它,但它返回完整的数组,并且没有正常工作。

最后我必须返回项目 - 数组中过期日期大于今天的对象。一定是箭头函数

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

【问题讨论】:

  • 您正在比较字符串并期望 JS 引擎理解您希望它们被视为日期对象。考虑使用库进行这些类型的比较:date-fns.org/v1.9.0/docs/isAfter

标签: javascript arrays date object ecmascript-6


【解决方案1】:

这是在进行字典比较——不是你想要的。只需将两个Dates 一起比较 - 使用箭头函数意味着您还可以有一个隐式返回

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 是将日期字符串变成有效日期——并非所有浏览器都支持连字符日期。

【讨论】:

  • 解构是一个不错的选择,但不是很明显。也许你可以添加一个脚注?
  • 没问题@msg,我会添加一个 ES5 变体。
  • 使用内置日期解析器不是一个好主意,尤其是对于 ECMA-262 不支持的格式。
【解决方案2】:

您正在比较两个不同的字符串。最好将日期对象转换为时间戳或任何可以比较的值。

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

并且您正在尝试与“2019 年 3 月 24 日”类似的内容进行比较。可能的流程是:

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)

【讨论】:

【解决方案3】:
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();

阅读更多关于filter

对于旧版浏览器

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();

【讨论】:

  • 这在某些浏览器中不起作用。见What are valid Date Time Strings in JavaScript?
  • @str 究竟是什么在编辑后的代码中不起作用?
  • new Date('09-24-2019') => Invalid Date
  • @str 我必须比较它的月份 Date.getMonth()+1 和日期 Date.getDate() 和年份 Date.getFullYear()
  • “for old browsers”功能存在严重缺陷(“older”的唯一原因是使用了const,这是不必要的)。使用内置解析器解析字符串不是一个好主意,尤其是当字符串不是 ECMA-262 支持的格式时。
【解决方案4】:

您可以使用 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)
};

【讨论】:

  • 这在某些浏览器中不起作用。见What are valid Date Time Strings in JavaScript?
  • 已更新,现在应该没问题了
  • 按字典顺序比较字符串,而不是日期,并且使用的格式不能正确比较为字符串,例如'06-20-2019' &gt; '07-01-2018' 返回 false,但如果作为日期比较则应该为 true。不过转换为 YYYY-MM-DD 是可行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
相关资源
最近更新 更多