0

我想看看我的数组中的一个项目是否是今天创建的,所以我使用 arrayFilter 过滤数组中的每个元素,问题是,我无法让我的过滤器正常工作:

return ko.utils.arrayFilter(self.enquiries(), function (enquiry) {
    var include = true;

    if (self.onlyToday()) {
        var formatted = $.datepicker.formatDate("dd/mm/yy", new Date());

        include = include && +enquiry.EnquiryDate.indexOf(+formatted > -1);
    }

    return include;
});

这是我的数据的样子:

formatted: 26/11/2012
enquiry.EnquiryDate: 08/11/2012 08:46:46 

很明显,这enquiry应该被过滤,因为它不是今天创建的。

4

1 回答 1

2

这里有几个问题。

  1. 您将字符串放入 中formatted,然后使用+formatted > -1. +formattedwill always be NaN, which is never > -1(它也永远不等于-1和 never < -1)。

  2. 您正在设置includetrue然后执行include = include && .... 后面的部分&&永远不会被评估,因为&&istrue和 JavaScript(像大多数现代语言一样)左侧的部分会使表达式短路。

  3. 如果enquiry指的是一个对象,+enquiry除非NaN你覆盖了它的valueOf.

  4. 您正在比较strings,这意味着比较的最重要部分将在左侧 - 但您的日期字符串的格式是最重要的值在右侧。因此,例如,string小于 "01/01/2013"string 即使它们所代表的日期当然不是这样如果你想有意义地比较日期字符串,它们必须在左边有年份,然后是月份,然后是日期。 "02/02/2012"

根据您引用的enquiry.EnquiryDate字符串,您可以执行以下操作:

var today = $.datepicker.formatDate("yy/mm/dd", new Date());
return ko.utils.arrayFilter(self.enquiries(), function (enquiry) {
    var parts, enqDate;

    parts = enquiry.EnquiryDate.split(' ')[0].split('/');
    enqDate = parts[2] + '/' + parts[1] + '/' + parts[0];
    return enqDate === today;
});

以上注意事项:

  • 请注意,我得到的是今天的日期,左边是年份。

  • 我删除了该位,因为如果过滤器为假self.onlyToday(),过滤器不会做任何事情。self.onlyToday()我的猜测是你想要在这个过滤器函数之外进行检查,你要么调用这个过滤器,要么不调用。

  • 由于enquiry.EnquiryDate是日期时间字符串,以空格分隔,首先我们将其拆分为空格,然后我们将第一部分(日期)拆分为/. 然后我们按yy/mm/dd顺序重新组合。

  • 现在我们知道我们可以===在字符串上执行以查看查询日期是否等于今天。

当然,您可以使用Date对象进行此比较,但无论如何您只需要将enquiry.EnquiryDate字符串解析为Date对象,并且您只需要日分辨率(而不是毫秒分辨率),因此使用字符串比较似乎是合理的。

于 2012-11-26T14:27:34.187 回答