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

时间:2017-01-17 15:54:45

标签: javascript angularjs compare coercion

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

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

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

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

我认为这个任务很简单,但由于ambiguous nature of 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中有一些有用的shorthand coding techniques如:

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

我试图在这里使用它们,但它只会导致沮丧,因为总有一个边缘情况没有被覆盖。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可以使用exclusive OR并使用

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

这意味着,如果oldValue为真,且newValue为假,或oldValue为假,而newValue为真,则更新数据。

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

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