Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅自身对象的深度对象相等性';香港在柴的物业_Javascript_Chai - Fatal编程技术网

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、 g
var objs=[obj1,obj2,obj3]
expect(objs).to.contain(obj2)仍然失败,因为我必须手动迭代所有对象并删除它们的原型属性(应用您的修复)。我不熟悉Chai,但通过查看它们的API,似乎没有任何内置支持。如果将“我的代码”提取到实用程序函数中,则始终可以将其与array
map
方法结合使用,将原始对象数组映射到投影数组中。对不起,我看不到更平滑的解决方案。