【问题标题】:Object equality check when strings turn into numbers字符串变成数字时的对象相等性检查
【发布时间】:2020-06-03 09:58:58
【问题描述】:

我需要比较 2 个对象。它们之间的区别在于最初将数字存储为字符串,然后在表单加载时表单验证器将它们转换为数字。

原始对象

{
  firstNumber: "1",
  secondNumber: "2"
}

加载后

{
  firstNumber: 1,
  secondNumber: 2
}

我尝试过angular.equals,但由于它们的类型不相等(===),函数返回 false。 JSON.stringifying 也无济于事。对象可以变得相当大。我只是想检测表单上所做的任何更改,但不能,因为它总是告诉我表单已更改。有没有考虑到上述情况的功能?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    使用非严格相等。

    一个使用 lodash isEqualWith:https://lodash.com/docs/4.17.15#isEqualWith

    修改为使用非严格等于:Javascript - deepEqual Comparison

    在检查之前使用 typeof 检查是否有两个原语可能更安全。有更快的 deepEquals 实现。您可以只修改它们以不使用严格等于,或使用 typeof 检查,然后将它们显式转换为数字或字符串以进行比较。

    data1={
      firstNumber: "1",
      secondNumber: "2"
    }
    
    
    data2={
      firstNumber: 1,
      secondNumber: 2
    }
    
    console.log(
    _.isEqualWith(data1,data2,(x,y)=>typeof x==="object"&&typeof y==="object"?undefined:x==y)
    )
    
    var deepEqual = function (x, y) {
      if (x == y) {
        return true;
      }
      else if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
        if (Object.keys(x).length != Object.keys(y).length)
          return false;
    
        for (var prop in x) {
          if (y.hasOwnProperty(prop))
          {  
            if (! deepEqual(x[prop], y[prop]))
              return false;
          }
          else
            return false;
        }
    
        return true;
      }
      else 
        return false;
    }
    
    console.log(
    deepEqual(data1,data2)
    )
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多