You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤对象内的数组?对象突变与测试误报问题求助

问题分析与解决方案

核心问题

当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:33:28