如何在Jasmine中对数组进行部分对象匹配比较?
可以实现,Jasmine提供了对应的匹配器组合方案
针对你需要的部分对象属性匹配+数组验证需求,完全可以通过jasmine.objectContaining结合数组相关匹配器实现,无需逐个遍历元素。分两种场景处理:
1. 数组元素顺序严格一致
如果你的两个数组元素顺序完全对应(像示例里的情况),可以直接将testArray的每个元素转换为jasmine.objectContaining匹配器,再用toEqual验证:
const originalArray = [ { a: 0, b: 0, random: 0}, { a: 1, b: 1, random: 0}, // ...更多元素 ]; const testArray = [ { a: 0, b: 0}, { a: 1, b: 1}, // ...更多元素 ]; // 验证originalArray的每个元素都包含testArray对应位置的所有属性 expect(originalArray).toEqual( testArray.map(item => jasmine.objectContaining(item)) );
jasmine.objectContaining会忽略对象中额外的属性(比如示例里的random),只验证指定的属性是否存在且匹配。
2. 数组元素顺序不固定
如果元素顺序无关紧要,可结合expect.arrayContaining使用,同时建议额外验证数组长度确保元素数量一致:
// 验证originalArray包含所有testArray的元素(不考虑顺序) expect(originalArray).toEqual(expect.arrayContaining( testArray.map(item => jasmine.objectContaining(item)) )); // 确保元素数量一致,避免原数组多元素的情况 expect(originalArray.length).toBe(testArray.length);
如果使用Jasmine 3.3及以上版本,还可以用jasmine.arrayWithExactContents替代上面的组合,它会同时验证元素存在性和数量:
expect(originalArray).toEqual(jasmine.arrayWithExactContents( testArray.map(item => jasmine.objectContaining(item)) ));
这样就能高效完成大数组的部分对象属性匹配验证,无需手动遍历每个元素。
内容的提问来源于stack exchange,提问作者Drenai
相关产品推荐
相关产品推荐

