Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测并比较两个字符串日期值_Javascript_Angularjs_Date_Object_Numbers - Fatal编程技术网

Javascript 检测并比较两个字符串日期值

Javascript 检测并比较两个字符串日期值,javascript,angularjs,date,object,numbers,Javascript,Angularjs,Date,Object,Numbers,我在Angularjs中有两个JavaScript对象。它们都具有相同的键,但值不同。看起来是这样的: $scope.object1 = { name: 'Arpit', roll_no: 999, // Number creation_date: '2017-04-10T04:44:21.923Z', // date value but string joining_date: '2017-03-30T18:30:00.000Z' // date value b

我在
Angularjs
中有两个JavaScript
对象。它们都具有相同的
,但
值不同
。看起来是这样的:

$scope.object1 = {
    name: 'Arpit',
    roll_no: 999, // Number
    creation_date: '2017-04-10T04:44:21.923Z', // date value but string
    joining_date: '2017-03-30T18:30:00.000Z' // date value but string
}
第二个目标是:

$scope.object2 = {
    name: 'Arpit1',
    roll_no: '999', // Number but string
    creation_date: 2017-04-10T04:44:21.923Z, // date value not string
    joining_date: 2017-03-30T18:30:00.000Z // date value not string
}
现在我想比较这两个对象,并想检测不同的值。 相比之下,
999
应等于
'999'
'2017-03-30T18:30:00.000Z'
应等于
2017-03-30T18:30:00.000Z
,依此类推

挑战

var data = {
     options:{
        data: $scope.object1
     },
     newData: $scope.object2
}

angular.forEach(data.options.data, function (value, key) {

    //compare fields
    if (data.newData[key] != data.options.data[key]) {

        if (filedsToSkip.indexOf(key) == -1) {

            if ((angular.isDate(data.newData[key]) || angular.isDate(data.options.data[key])) && new Date(data.newData[key]) != new Date(data.options.data[key])) {
                $ctrl.updatedFields.push({
                    field: key,
                    newValue: data.newData[key],
                    oldValue: data.options.data[key]
                });
            } 
        } else {
            console.log("Field skipped");
        }


    }
});
日期和数字的值可能是字符串格式,因此首先我需要检测给定的字符串是日期还是数字,然后需要进行比较

我的代码

var data = {
     options:{
        data: $scope.object1
     },
     newData: $scope.object2
}

angular.forEach(data.options.data, function (value, key) {

    //compare fields
    if (data.newData[key] != data.options.data[key]) {

        if (filedsToSkip.indexOf(key) == -1) {

            if ((angular.isDate(data.newData[key]) || angular.isDate(data.options.data[key])) && new Date(data.newData[key]) != new Date(data.options.data[key])) {
                $ctrl.updatedFields.push({
                    field: key,
                    newValue: data.newData[key],
                    oldValue: data.options.data[key]
                });
            } 
        } else {
            console.log("Field skipped");
        }


    }
});
但是这个代码不能正常工作。请提出一些建议

谢谢

编辑

现在,当我运行此代码时,它显示所有字段都不同,但我希望它只显示
名称
不同。

您可以使用
!isNaN(Date.parse(v))
评估值是否为日期:

让可能=[999,'999','2017-03-30T18:30:00.000Z']
可能的。forEach((v)=>{
log(“is date:,!isNaN(date.parse(v));

});在得到一些建议后,我修改了代码:

angular.forEach(data.options.data, function (value, key) {

    //compare
    if (data.newData[key] != data.options.data[key]) {

        if (filedsToSkip.indexOf(key) == -1) {

            if ((angular.isDate(data.newData[key]) || angular.isDate(data.options.data[key])) && new Date(String(data.newData[key])) !== new Date(String(data.options.data[key]))) {
                $ctrl.updatedFields.push({
                    field: key,
                    newValue: data.newData[key],
                    oldValue: data.options.data[key]
                });
            } else if (data.newData[key] !== "" && data.options.data[key] !== "") {
                $ctrl.updatedFields.push({
                    field: key,
                    newValue: data.newData[key],
                    oldValue: data.options.data[key]
                });
            }

        } else {
            console.log("Field skipped");
        }
    }
});
它工作得很好。我不确定这是不是一个100%完美的解决方案,但我很好。谢谢。

如图所示,两个日期对象之间的比较可能很棘手:

var d1 = new Date();
var d2 = new Date(d1);
d1!==d2;  //true
不过,我认为OP的答案并不十分正确。考虑这个例子:

var x  = '2017-04-10T04:44:21.923Z';
var d1  = new Date(String(x));
var d2 = new Date(String(x));
d1!==d2; //true
我建议在回答问题时使用其中一种解决方案。可以使用
getTime()
来比较日期。在上述示例中:

d1.getTime()!==d2.getTime(); //false

@Zze_389;,但在数字比较时会发生冲突。它说的数字也是
true
。woahhhhhhhh-所以我刚刚在Chrome上测试了这一点,并且确实适用于所有人。FF和edge符合预期。我不确定这是否导致问题。在第15行(大if条件),如果其中一个值的isDate为false,而另一个值的isDate为true,会发生什么情况?在这种情况下,条件的第一部分变为真,第二部分也可能变为真,因为
Date
也可以返回一个数字的有效结果(例如
new Date(“2017”)
),如果您指定了不正常工作的内容,则会有所帮助,也就是说,预期的输出是什么,以及代码的输出与预期的输出有什么不同。此外,您为
if
else if
执行的块完全相同。我面临着同样的问题。这意味着
2017-03-30T18:30:00.000Z
不等于
“2017-03-30T18:30:00.000Z”
。您可以尝试的另一件事是使用正则表达式来验证日期(特别是在Unix格式的情况下),并继续执行其余代码。例如,见。