根据日期将项目添加到两个数组(未来和过去的日期)中

add items into two arrays (future and past dates) based on date

我正在尝试找到一种方法将帖子分类为两个数组:即将发布的和当前的(即将发布的帖子在未来,当前已经发布)。

所有帖子都有一个 scheduledPubDate,它是 YYYY-MM-DDT00:00:00 格式的日期字符串。今天的日期必须是日期对象,因为它需要保持相关性(我正在使用 moment())

是否可以比较这两个不同的东西而不必使用 .split 并分别比较月/日/年

 angular.forEach(data.items, function (key, index) {
   if (moment(key.scheduledPubDate) > moment()) {
       $scope.upcomingPosts.push(item[index]);
   } else if (moment(key.scheduledPubDate) <= moment()) {
       $scope.currentPosts.push(item[index]);
   };
 });

首先以任意顺序创建一个元素数组,然后使用 .sort() 方法。

http://www.w3schools.com/jsref/jsref_sort.asp

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a-b});  

只需用您自己的逻辑替换上述逻辑即可。上面的a和b可以是对象。

您必须指定字符串的日期格式

 var format = "YYYY-MM-DDT00:00:00";
 angular.forEach(data.items, function (key, index) {
   if (moment(key.scheduledPubDate, format) > moment()) {
     $scope.upcomingPosts.push(item[index]);
   } else if (moment(key.scheduledPubDate, format) <= moment()) {
     $scope.currentPosts.push(item[index]);
   };
 });

工作示例(参见 console.log):http://jsbin.com/fejaxiguce/1/edit?html,output

JavaScript 的内置 Date object 会在这里帮助你。

var date = Date.parse('2014-01-21T12:45:13');
date < Date.now() // true

为了举例,我们假设 items 是一个帖子数组:

var items = [{
    scheduledPubDate: '2014-01-21T12:45:13'
    // ...other keys here
}, {
    scheduledPubDate: '2017-03-01T15:21:00'
} // ...and so on
];

然后对 itemsreduce 操作可以对帖子进行分类:

var posts = items.reduce(function (memo, item) {
    memo[Date.parse(item.scheduledPubDate) <= Date.now() ? 'current' : 'upcoming'].push(item);
    return memo;
}, { current: [], upcoming: [] });

现在 posts.current 将包含来自 itemsscheduledPubDate 在当前日期之前的所有帖子的数组,并且 posts.upcoming 将包含所有计划帖子的数组.

编辑为使用 Date.parse,以避免 RobG 指出的不可靠行为。这要求所有日期都采用您指定的 YYYY-MM-DDT00:00:00 格式;如果不是这种情况,则需要另一种解决方案。

大概您希望将字符串视为 UTC,一个简单的解析器是:

// Expected format YYYY-MM-DDT00:00:00
function parseUTC(s) {
  var b = s.split(/\D/);
  return new Date(Date.UTC(b[0], b[1]-1, b[2], b[3], b[4], b[5]));
}

请注意,这不允许无效日期。如果需要,需要额外的一行代码。所以现在你可以这样做:

if (parseUTC(key.scheduledPubDate) > new Date()) // or Date.now()

你真的不需要moment.js。