将值与两个javascript对象进行比较的最佳方式



我正在写一堆单元测试,想知道比较两个javascript对象的值(实际值与预期值(的最佳方法是什么。假设我有以下

ActualObject: {
Val1: '1',
Val2: '2',
Val3: '3',
Val4: '4'
}
ExpectedObject: {
Val1: '1',
Val2: '2',
Val3: '3',
Val4: '4'
}

现在我想检查每个对象中属性的值是否相等。最好的方法是什么。目前,我正在单独比较所有属性。我能想到的替代方案是JSON.stringify,但我不确定这是否会随机改变属性的顺序?

这并不是一个简单的"一刀切"的解决方案,尤其是当你的问题的参数非常广泛时。例如,你认为平等是什么?严格的释放只有自己的可枚举属性相等,还是所有属性相等?

我建议不要使用JSON.stringify:1(串行化对象是一种成本相当高的操作,尤其是在频繁执行的情况下;2(为了进行比较,它以潜在的危险方式转换值(例如JSON.stringify(NaN) === JSON.stringify(null) //=> true(。

您应该使用像lodash的isEqual这样的库实现,并省去重新设计轮子的痛苦。

然而,为了完整性,并让您了解一种简单、天真的方法,您可以在对象ExpectedObject的每个属性上循环,并检查与对象ActualObject中的等效属性是否相等,如下所示:

function isEqual (ExpectedObject, ActualObject) {
// if the ExpectedObject has a different number of
//   keys than ActualObje, it is not equal
if (Object.keys(ExpectedObject).length !== Object.keys(ActualObject).length) {
return false
}
for (const key in ExpectedObject) {
// if ActualObject does not have a property that is
//   on ExpectedObject, it is not equal
if (!(key in ActualObject)) {
return false
}
// if a property's value on ActualObject is not equal
//   with a strict comparison, to the equivalent property 
//   on ExpectedObject, it is not equal
if (ActualObject[key] !== ExpectedObject[key]) {
return false
}
}
return true
}
console.log(isEqual({ a:1 }, { a: 1 })) //=> true
console.log(isEqual({ a:1 }, { a: "1" })) //=> false
console.log(isEqual({ a:1 }, { a: 1, b: 2 })) //=> false

显然,你需要引入类型检查,这样你就知道你一开始是在处理对象,但有一个基本的想法需要你考虑。

相关内容

  • 没有找到相关文章

最新更新