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

如何在JSON对象比较时用通配符/正则排除含特定字符的属性?

解决方法:用Lodash排除含指定字符串的属性后比较对象

你的思路没问题,但当前的写法行不通——Lodash的_.omit接收数组参数时,只会精确匹配属性名,并不支持*foo*这种通配符语法。不过我们可以用_.omitBy来实现你想要的效果,它允许通过自定义函数判断要排除的属性。

正确实现代码

var obj1 = {name: "James", age: 17, creation: "13-02-2016", deletion: "13-04-2016", foo_x:"", foo_y:"", foo_z:""};
var obj2 = {name: "Maria", age: 17, creation: "13-02-2016", deletion: "13-04-2016", foo_x:"", foo_y:"", foo_z:""};

// 排除所有键名包含"foo"的属性后比较
var result = _.isEqual(
  _.omitBy(obj1, (value, key) => key.includes('foo')),
  _.omitBy(obj2, (value, key) => key.includes('foo'))
);

console.log(result); // 输出 false(因为两个对象的name属性不同)

代码解释

  • _.omitBy会遍历对象的每一个键值对,第二个参数是判断函数:如果函数返回true,对应的属性就会被排除。
  • 这里用key.includes('foo')检查属性名中是否包含foo字符串,所有符合条件的属性都会被过滤掉。
  • 最后用_.isEqual比较两个过滤后的对象,就能得到你想要的结果。

另一种实现方式(先收集要排除的键)

如果你更习惯用_.omit,也可以先收集所有包含foo的属性名,再传给_.omit:

// 收集obj1中包含foo的键
const obj1FooKeys = Object.keys(obj1).filter(key => key.includes('foo'));
// 收集obj2中包含foo的键
const obj2FooKeys = Object.keys(obj2).filter(key => key.includes('foo'));

var result = _.isEqual(
  _.omit(obj1, obj1FooKeys),
  _.omit(obj2, obj2FooKeys)
);

这种方式和第一种效果完全一致,只是写法不同,你可以根据自己的习惯选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:54:53