Javascript 如何从数组中提取可比较的日期?

Javascript 如何从数组中提取可比较的日期?,javascript,jquery,arrays,object,momentjs,Javascript,Jquery,Arrays,Object,Momentjs,我有一个对象对象,其格式如下: var data = { 09-29-2017: Array[ {jobNumber: "59067", jobState: "FinishedGoods"}, {jobNumber: "59068", jobState: "inManufacturing"} ], 09-08-20

我有一个对象对象,其格式如下:

var data = {
             09-29-2017: Array[
                               {jobNumber: "59067", jobState: "FinishedGoods"},
                               {jobNumber: "59068", jobState: "inManufacturing"}
],     
            09-08-2017: Array[
                               {jobNumber: "62155", jobState: "Approved"}]
。。。在许多日期以及每个日期0-50个jobNumber和相应JobState之间的任何位置继续

我们的工作周定在星期五,所以每个日期都是星期五,这就是前一周的所有工作

使用javascript、jquery、moment.js或任何其他建议的库,我试图编写一个函数,将数据对象中的日期传递到该函数,并返回一个数组,其中包含至少有一个大于或等于最近星期五的作业的所有日期

到目前为止,我已经想到了这个:

function getWeeksWithJobs(){
    var data = getData(); //This is the object of arrays of objects that I'm trying to pull the date from
    var today =  new Date(); 
    today = moment(today).format('MM-DD-YYYY'); 
    var weekRay = []; // this is the array I'm trying to return with just the dates that fit the specifications
    $.each(data, function(index, value){  //in this function index returns the date, and the value returns the array containing the objects.

        if (data[index].length > 0) // this seems to be working fine 
            //I'm just stuck here with how to compare the dates
            //If I use moment(index).format('MM-DD-YYYY') it throws an error
            //If I just use console.log(index) it outputs the date
            // in the right format and everything no punctuation or anything 
            // If I just compare them normally index >= today it just
            // compares the month.
                weekRay.push(index);

    });
    return weekRay;
}
我最大的问题是试图使日期具有可比性,它们都采用相同的格式“MM-DD-YYYY”,但它们不进行比较。我欢迎任何建议,提前谢谢你

编辑: 我发现了一些可行的方法,如果我使用today=moment(today,'MM-DD-YYYY')将日期转换为moment对象,然后将它们传递给一个函数,该函数将日期转换为epochValue:

function epochDays(date)
{
date = new Date(date) // and then convert them back into a Date object
return Math.floor(date /day_mSecs);  //const day_mSecs =86400000 
}

所以我必须先把变量转换成一个矩()对象,然后再从那里转换成一个日期对象,我甚至还没来得及处理它们。它们最终是可比较的,我能够找到当前日期之后的几天。谢谢大家的帮助

将非标准日期字符串传递到
矩()时,需要提供格式参数。

例如:

moment("12-25-1995", "MM-DD-YYYY");

请尝试以下代码来比较日期

var today =  new Date();
today.setHours(0,0,0,0);

$.each(data, function(index, value){

  if (data[index].length > 0){

    // if index returns the date than
    var newIndex = new Date(index);
    newIndex .setHours(0,0,0,0);

    // now compare the both dates

    if(newIndex >= today)
    {
      // TO DO
    }


    weekRay.push(index);
  }
});

您可以使用ISO日期,因为您可以直接比较字符串,而无需转换或使用其他方法

在这个方案中,对给定的密钥进行迭代和检查。忽略过去数组或空数组中的所有日期。如果实际日期小于迭代日期,则通过检查得出结果

这适用于未排序的键

var数据={
‘2017-09-29’:[{工作编号:“59067”,工作状态:“已完成货物”},{工作编号:“59068”,工作状态:“正在制造”}],
‘2017-09-22’:[{工作编号:“5yy67”,工作状态:“成品”},{工作编号:“5yy68”,工作状态:“制造业”}],
'2017-09-15': [],
‘2017-09-08’:[{工作编号:“62155”,工作状态:“批准”},
},
日期='2017-09-14',
结果=对象。键(数据)。减少(函数(r,k,i){
如果(!数据[k].长度| | k<日期){
返回r;
}
return!r | | k控制台日志(结果)我遇到了一个更大的问题,因为我不仅需要比较日期,还需要逐日迭代日期范围

我的解决方案是将日期简单地存储为从历元时间算起的天数,因此它们是简单的整数

当然,如果您只需要出于排序目的比较日期,则不必以该格式存储日期。您可以简单地依赖转换函数

下面是我所做工作的简化示例:

const day_mSecs = 86400000;

function epochDays (date) {
    return Math.floor( // Epoch days (comparable dates).
        new Date(date) / day_mSecs
    );
};

console.log(epochDays('12-25-1995')); // 9488
编辑:

在重新阅读第二条@Jeanze注释后,我注意到在重写稍微复杂一点的函数以使其更简单(为了更好地适应这个问题)时,我错误地删除了生成的日期对象上的
(…).valueOf()

…并猜测(即使我也不确定)原因可能是什么,因为之前的截取对我来说很有效,但可能会失败,具体取决于实际的Javascript引擎

也就是说:
newdate(Date)
返回一个日期对象,而不是一个数字,所以当我们试图将它当作一个数字来操作时(
/day\mSecs
),如果返回的对象有它,大多数javascript引擎应该尝试通过
.valueOf()
方法来转换它

因此,如果发动机太旧,并且:

  • 它的日期对象不提供
    .valueOf()
    方法(这是不可能的,因为)

  • …或者,由于某种原因,js引擎不尝试将其强制转换为ingeger调用
    .valueOf()

…然后它将返回@Jeanze报告的NaN结果

在第一种情况下,有一个替代方法()也执行同样的操作。甚至有必要显式调用它(事实上,我在为本文简化的函数中使用了
.valueOf()

下面是使用
.getTime()
的前一个代码段的固定版本:

…甚至,如果它能工作(对于第一个版本(如@Jeanze的版本)出现故障的引擎),检查它是否也能工作,并用
.valueOf()
(这次显式调用):


参见文档部分,moment有
isAfter
isBefore
isame
方法来比较moment对象。您可以使用日期,这些日期具有可比性且易于使用,无需转换为日期对象。我认为它必须是一个日期字符串,如
data={“2017-01-01”:Array[]}
作为标识符,因为
-
字符2017-01-01不带引号,将尝试计算,还是不计算?@VincenzoC我已经尝试过。isAfter、isBefore和isSame他们只会给我错误,因为它们的格式不正确。@NinaScholz我如何转换它们?使用矩或尝试使用Date()会更简单吗?那么我只使用矩(index,'MM-DD-YYYY'),这与添加矩(index.format('MM-DD-YYYY')有什么不同吗?因为我尝试了第二种方法,但它仍然会给我错误。是的,不同。
format()
函数用于从矩日期对象返回字符串。但您首先需要一个有效的对象,它会给我以下错误:“弃用警告:提供的值不是可识别的RFC2822或ISO格式,这在所有浏览器和版本中都不可靠。不鼓励使用非RFC2822/ISO日期格式,并将在即将发布的主要版本中删除。看起来它的格式仍然不正确。如果我硬编码日期,我可以让它正常工作,但我需要它是动态的
const day_mSecs = 86400000;

function epochDays (date) {
    return Math.floor( // Epoch days (comparable dates).
        (new Date(date)).getTime() / day_mSecs
    );
};

console.log(epochDays('12-25-1995')); // 9488
        // (new Date(date)).getTime() / day_mSecs
        (new Date(date)).valueOf() / day_mSecs