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

时间:2017-04-10 05:11:59

标签: javascript angularjs date object numbers

我在objects中有两个JavaScript Angularjs。它们都具有相同的keys但不同的values。看起来像这样:

$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");
        }


    }
});

但是此代码无法正常运行。请给出一些建议。

感谢。

修改

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

3 个答案:

答案 0 :(得分:0)

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

let possible = [999, '999', '2017-03-30T18:30:00.000Z']

possible.forEach((v) => {
  console.log("is date : ", !isNaN(Date.parse(v)));
});

如果true,那么您可以进行比较。

答案 1 :(得分:0)

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

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%完美的解决方案,但我很好。感谢。

答案 2 :(得分:0)

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

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

我建议使用this答案中的一个解决方案。也许使用getTime()来比较日期。在上面的例子中:

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