【问题标题】:How to check equality of two objects, one object's attribute's type is number other ones type is string but they are numbers [duplicate]如何检查两个对象的相等性,一个对象属性类型是数字,其他类型是字符串,但它们是数字[重复]
【发布时间】:2021-09-20 21:10:35
【问题描述】:

如何检查两个对象的相等性,一个对象类型是数字,另一个是字符串类型,但是数字

var object1 = {  
        x1: "1.000000",
        x2: undefined,
        x3: "1.0",
        x4: "1.0" 
};
var object2 = {  
        x1: 1,
        x2: undefined,
        x2: 1,
        x4: 1 
};

lodash 在上述情况下返回 false。 _.isEqual(object1, object2);

【问题讨论】:

标签: javascript typescript ecmascript-6


【解决方案1】:

你可以使用_.isEqualWith:

var object1 = {  
        x1: "1.000000",
        x2: undefined,
        x3: "1.0",
        x4: "1.0" 
};
var object2 = {  
        x1: 1,
        x2: undefined,
        x3: 1,
        x4: 1 
};

const cmpStr2Num = (val1, val2) => {
  if ((typeof val1 === 'string' && typeof val2 === 'number')
   || (typeof val2 === 'string' && typeof val1 === 'number'))
     return Number(val1) === Number(val2)
}

console.log(_.isEqualWith(object1, object2, cmpStr2Num))
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    因为字符串和数字是不同的类型。

    "1" === 1 // false
    

    可以强制类型的对象的值

    const coerceObject = object => Object.fromEntries(
        Object.entries(object).map(([key, value]) => {
            return [[key], Number.isNaN(+value) ? value : Number.parseFloat(value)]
        })
    )
    
       _.isEqual(coerceObject(object1), coerceObject(object2));
    

    【讨论】:

      【解决方案3】:

      这行得通:

      var object1 = {
        x1: "1.000000",
        x2: undefined,
        x3: "1.0",
        x4: "1.0"
      };
      var object2 = {
        x1: 1,
        x2: undefined,
        x2: 1,
        x4: 1
      };
      
      const equal = !Object.keys(object1).some(key => object1[key] != object2[key])
      
      console.log(equal)
      

      但是,在您的示例中,object2 有一个键被覆盖(x2 被定义了两次),因此使用上述代码的对象不被视为相等

      【讨论】:

      • 为什么要导入 lodash?
      • @Ricola 不确定我是否理解您的问题
      • 你用import _ from 'lodash'开始你的剪辑,但不要使用它
      • 啊,真的:+1:谢谢
      猜你喜欢
      • 2020-04-23
      • 1970-01-01
      • 2016-09-04
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多