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

时间:2015-02-13 00:50:29

标签: javascript angularjs momentjs

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

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

是否可以比较这两种不同的东西而不必使用.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]);
   };
 });

4 个答案:

答案 0 :(得分:1)

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
];

然后对reduce的{​​{1}}操作可以对帖子进行分类:

items

现在var posts = items.reduce(function (memo, item) { memo[Date.parse(item.scheduledPubDate) <= Date.now() ? 'current' : 'upcoming'].push(item); return memo; }, { current: [], upcoming: [] }); 将包含来自posts.current items在当前日期之前的所有帖子的数组,scheduledPubDate将包含所有预定帖子的数组。< / p>

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

答案 1 :(得分:1)

据推测,您希望将字符串视为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。

答案 2 :(得分:0)

首先按任意顺序创建一个元素数组,然后使用.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可以是对象。

答案 3 :(得分:0)

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

 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