我在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
不同。
答案 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