实现JavaScript函数areDifferent(oldValue,newValue)来比较类似人类的空虚风格



我从后端获取和对象,并使用AngularJS将它们放入输入字段(输入、文本区域、复选框、下拉列表)。

这些属性在某些情况下是文本值,在某些情况中是数值,但也可以是nullundefinedfalse""

我克隆这个对象,然后通过比较旧的(存储的)值和新的(当前的)值来检查用户是否对这些值中的每一个进行了任何修改。

我不想使用ng-dirty类来检测更改,因为当您在之前的修改后返回到之前的值时(例如,当使用Ctrl+Z时),它不会消失。

我原以为这个任务会很简单,但由于JS值的模糊性,我遇到了麻烦。

我当然会治疗每一种:

  • null
  • undefined
  • false
  • ""

一个"空值",因为对于用户来说,无论模型在下面存储什么,"空字段就是空字段"。因此,例如,从undefined""的变化并不是真正的变化。

到目前为止,我得到了这个:

$scope.areDifferent = function (oldValue, newValue) {
var a = true, b = true;
if (oldValue === null ||
oldValue === undefined ||
oldValue === false ||
oldValue === "") {
a = false; 
}
if (newValue === null ||
newValue === undefined ||
newValue === false ||
newValue === "") {
b = false; 
}
if (!a && !b) {
return false; // both values are "empty"
}
else if (a != b) {
return true; // one of the values is "non-empty"
}
else {
return oldValue != newValue; // compare the value of "non-empty" properties
}
}

但我很好奇这是否正确(有任何未覆盖的边缘情况吗?),以及它是否可以简化,因为我知道在JS中有一些有用的简写编码技术,比如:

  • a || ''
  • if(a)
  • if(a.length)
  • if(a == null)

我试过在这里使用它们,但这只会导致沮丧,因为总有一种边缘情况没有被覆盖。感谢您的帮助。

您可以使用异或并使用检查值

if (!oldValue && newValue || oldValue && !newValue) {
// update
}

也就是说,如果oldValue是真的并且newValue是假的或者oldValue是假的并且newValue是真的,则对数据进行更新。

对相同类型和更改的扩展检查。

if (!oldValue && newValue || oldValue && !newValue || typeof oldValue === typeof newValue && oldValue !== newValue) {
// update
}

相关内容

  • 没有找到相关文章

最新更新