根据日期将项目添加到两个数组(未来和过去的日期)中
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
];
然后对 items
的 reduce
操作可以对帖子进行分类:
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
在当前日期之前的所有帖子的数组,并且 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。
我正在尝试找到一种方法将帖子分类为两个数组:即将发布的和当前的(即将发布的帖子在未来,当前已经发布)。
所有帖子都有一个 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
];
然后对 items
的 reduce
操作可以对帖子进行分类:
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
在当前日期之前的所有帖子的数组,并且 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。