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

Jest测试中对比两个JS对象时如何忽略深层嵌套的uuid属性

Jest 忽略嵌套uuid属性的对象相等对比方案

以下三种方案可根据你的使用场景选择:

方案1:递归清理uuid后直接对比

通用度最高,不限制对象结构,先移除所有层级的uuid属性后再做全等对比:

// 递归移除对象所有层级的uuid属性
const removeUUIDs = (obj) => {
  if (Array.isArray(obj)) {
    return obj.map(item => removeUUIDs(item));
  }
  if (obj !== null && typeof obj === 'object') {
    const newObj = {};
    for (const key in obj) {
      if (key !== 'uuid') {
        newObj[key] = removeUUIDs(obj[key]);
      }
    }
    return newObj;
  }
  return obj;
};

// 测试用例
test('两个对象除uuid外完全相等', () => {
  const object1 = { uuid: '5435443', name: 'xxx', branches: [{ uuid: '643643', children: [{ uuid: '65654' }] }] };
  const object2 = { uuid: '7657657', name: 'xxx', branches: [{ uuid: '443444', children: [{ uuid: '09809' }] }] };

  expect(removeUUIDs(object1)).toEqual(removeUUIDs(object2));
});

方案2:使用Jest不对称匹配器

适合明确知道对象结构的场景,不需要额外编写工具函数,直接用Jest自带的匹配器规则实现:

test('两个对象除uuid外完全相等', () => {
  const object1 = { uuid: '5435443', name: 'xxx', branches: [{ uuid: '643643', children: [{ uuid: '65654' }] }] };
  const object2 = { uuid: '7657657', name: 'xxx', branches: [{ uuid: '443444', children: [{ uuid: '09809' }] }] };

  // 匹配规则中不需要声明uuid字段,Jest会自动忽略未声明的字段做匹配
  const matchRule = expect.objectContaining({
    name: 'xxx',
    branches: expect.arrayContaining([
      expect.objectContaining({
        children: expect.arrayContaining([
          expect.objectContaining({})
        ])
      })
    ])
  });

  expect(object1).toEqual(matchRule);
  expect(object2).toEqual(matchRule);
});

方案3:自定义Jest匹配器复用逻辑

如果项目中频繁需要做忽略uuid的对比,可以封装为全局自定义匹配器,减少重复代码:

// 可放在jest.setup.js中全局注册,复用方案1的removeUUIDs工具函数
expect.extend({
  toEqualExceptUUID(received, expected) {
    const cleanReceived = removeUUIDs(received);
    const cleanExpected = removeUUIDs(expected);
    const pass = this.equals(cleanReceived, cleanExpected);
    
    if (pass) {
      return {
        message: () => `预期两个对象除uuid外不相等,但实际相等`,
        pass: true
      };
    } else {
      return {
        message: () => `预期两个对象除uuid外相等,差异如下:\n${this.utils.diff(cleanReceived, cleanExpected)}`,
        pass: false
      };
    }
  }
});

// 测试用例中直接调用
test('两个对象除uuid外完全相等', () => {
  const object1 = { uuid: '5435443', name: 'xxx', branches: [{ uuid: '643643', children: [{ uuid: '65654' }] }] };
  const object2 = { uuid: '7657657', name: 'xxx', branches: [{ uuid: '443444', children: [{ uuid: '09809' }] }] };

  expect(object1).toEqualExceptUUID(object2);
});

内容的提问来源于stack exchange,提问作者fullstack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:06:02