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

ulydmbyx  于 2021-09-13  发布在  Java
关注(0)|答案(3)|浏览(213)

此问题已在此处找到答案

在javascript比较中应该使用哪个等于运算符(==vs===)((48个答案)
昨天关门了。
如何检查两个对象的相等性,一个对象类型是数字,另一个对象是字符串类型但不是数字

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(反对1,反对2);

mrphzbgm

mrphzbgm1#

你可以用 _.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>
unguejic

unguejic2#

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

"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));
wqsoz72f

wqsoz72f3#

这项工作:

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 定义了两次),因此使用上述代码的对象被视为不相等

相关问题