如何过滤对象内的数组?对象突变与测试误报问题求助
问题分析与解决方案
核心问题
当前filterObject函数存在对象突变问题:它直接修改了传入的原对象myObject的capacitiesArray属性,导致原始数据被污染。这也是单元测试误报的根源——测试中如果用原对象作为预期结果,函数执行后原对象已经被修改为过滤后的状态,自然会“误通过”测试。
修复方案
要解决这个问题,必须保持数据的不可变性:创建原对象的副本,在副本上进行过滤操作,最终返回新对象而非修改原对象。
修改后的函数实现
function filterObject(myObject: MyObject, toggle: boolean): MyObject { if (toggle) { // 创建原对象的浅拷贝,避免修改原对象 return { ...myObject, // 过滤数组并替换到新对象中 capacitiesArray: myObject.capacitiesArray.filter(row => row.value1 !== row.value2) }; } // 无需过滤时直接返回原对象(或根据需求返回拷贝,这里保持与原逻辑一致) return myObject; }
说明
- 使用对象展开运算符
...myObject创建原对象的浅拷贝,确保原对象的属性不会被修改。 - 仅对拷贝后的对象的
capacitiesArray进行过滤替换,返回全新的对象。 - 这样处理后,原始输入对象完全不受影响,单元测试中用原对象作为预期结果时,会正确识别到与过滤后对象的差异,测试结果不再误报。
单元测试验证
修复函数后,若测试用例中仍以未过滤的原对象作为预期结果,测试会正确失败;若以过滤后的对象作为预期,测试会正常通过,符合预期逻辑。
内容的提问来源于stack exchange,提问作者Ahmed Hakmouni
相关产品推荐
相关产品推荐

