Javascript 仅自身对象的深度对象相等性';香港在柴的物业
我有一个对象,我想和另一个对象做一个深入的比较。问题在于一个对象有大量可枚举属性,而另一个对象是简单、直接的对象(Javascript 仅自身对象的深度对象相等性';香港在柴的物业,javascript,chai,Javascript,Chai,我有一个对象,我想和另一个对象做一个深入的比较。问题在于一个对象有大量可枚举属性,而另一个对象是简单、直接的对象({}) 例如,我有expect(obj1).to.eql(obj2)其中,obj1是一个具有许多附加可枚举属性的对象,库添加了这些属性,obj2只是通过var obj2={someValue:true}创建的 这个问题可以通过像这样滥用JSON.stringify和JSON.parse来解决 expect(JSON.parse(JSON.stringify(obj1))).to.eq
{}
)
例如,我有expect(obj1).to.eql(obj2)
其中,obj1
是一个具有许多附加可枚举属性的对象,库添加了这些属性,obj2
只是通过var obj2={someValue:true}
创建的
这个问题可以通过像这样滥用JSON.stringify
和JSON.parse
来解决
expect(JSON.parse(JSON.stringify(obj1))).to.eql(obj2);
但这是一个相当蹩脚的黑客。我无法想象我是第一个陷入这种困境的人,但我的搜索结果却是空的。这里推荐的方法是什么?我建议对您要测试的对象进行投影,该对象只包含“自己的”(不来自原型链)属性,并比较这些属性是否相等
var projection = {};
for (var key in obj1) {
if (obj1.hasOwnProperty(key)) {
projection[key] = obj1[key];
}
}
expect(projection).to.eql(obj2);
您可以将该投影代码提取到测试实用程序函数中。您可以尝试使用。它不执行完全相等检查,但检查第二个对象是否包含第一个对象的属性集
下面是使用示例:
var chai=require('chai');
chai.使用(要求(“chai-shall-deep-equal”);
var obj1={name:'Michel',language:'javascript'};
var obj2={name:'Michel'};
var obj3={姓名:'Michel',年龄:43};
expect(obj1).to.shallowDeepeEqual(obj2);//真的
expect(obj1).to.shallowDeepeEqual(obj3);//false,obj1中未定义年龄,因此要明确:您只想比较对象自身的属性,而不想比较库添加到原型链中的属性?@HannesJohansson这绝对正确。在我的一些测试中,我根本不关心原型属性。在这种情况下,你不想像问题标题中所说的那样忽略可枚举属性,你只想忽略不是对象自身属性的属性。这是一个不错的解决方案,但如果不将其转化为插件,它就无法真正与chai生态系统协同工作。e、 gvar objs=[obj1,obj2,obj3]
expect(objs).to.contain(obj2)代码>仍然失败,因为我必须手动迭代所有对象并删除它们的原型属性(应用您的修复)。我不熟悉Chai,但通过查看它们的API,似乎没有任何内置支持。如果将“我的代码”提取到实用程序函数中,则始终可以将其与arraymap
方法结合使用,将原始对象数组映射到投影数组中。对不起,我看不到更平滑的解决方案。