使用Moment比较日期以过滤结果

时间:2015-02-17 18:11:06

标签: arrays object underscore.js momentjs

我试图通过每个对象中的日期键过滤对象数组。

for (var e = 0; e < arrayOfObjects.length; e++){
    var objects = arrayOfObjects[e];
    var sortDate = _.filter(objects, function(n) {moment(n.date).isAfter(moment(timeCreated).subtract(110, 'days'))});
    console.log(sortDate); //console.log((moment(timeCreated).subtract(110, 'days')));
}

此代码返回一个空数组。 timeCreated之前和之后都有混合日期 - 110天。我还控制了记录比较的每个部分:

   Moment {_isAMomentObject: true, _i: "2014-07-24", _f: "YYYY-MM-DD ", _isUTC: false, _pf: Object…}_d: Thu Jul 24 2014 00:00:00 GMT-0700 (PDT)_f: "YYYY-MM-DD "_i: "2014-07-24"_isAMomentObject: true_isUTC: false_locale: Locale_pf: Object__proto__: Moment
dateCompare.controller.js:91 

Moment {_isAMomentObject: true, _i: Thu Feb 12 2015 20:22:41 GMT-0800 (PST), _isUTC: false, _pf: Object, _locale: Locale…}_d: Fri Nov 14 2014 20:22:41 GMT-0800 (PST)_i: Thu Feb 12 2015 20:22:41 GMT-0800 (PST)_isAMomentObject: true_isUTC: false_locale: Locale_pf: Object__proto__: Moment

2 个答案:

答案 0 :(得分:2)

如果要包含您的谓词,则传递给_.filter的谓词函数应该返回true

function(n) {moment(n.date).isAfter(moment(timeCreated).subtract(110, 'days'))}

始终返回undefined,因为它没有return。 JavaScript函数没有隐式返回值,您必须明确:

function(n) {
    return moment(n.date).isAfter(moment(timeCreated).subtract(110, 'days'))
// -^^^^^^
}

此外,您正在尝试_.filter单个对象,而不是数组。在循环内你有:

var objects = arrayOfObjects[e];

然后你_.filter(objects, ...)不会做任何有用的事情。

如果您包含return语句并过滤数组:

_.filter(arrayOfObjects, function(n) {
    return moment(n.date).isAfter(moment(timeCreated).subtract(110, 'days'))
});

然后应该没问题。

演示:http://jsfiddle.net/ambiguous/p7uab8uj/

答案 1 :(得分:2)

for (var e = 0; e < arrayOfObjects.length; e++) {
    var objects = arrayOfObjects[e];
    if (moment(objects.date).isAfter(moment(timeCreated).subtract(100, 'days'))) {
        var goodDates = [];
        goodDates.push(objects);
        console.log(goodDates);
    }
}