如何在JS/Node中实现类似PostgreSQL jsonb @>算子的对象包含校验
方案实现
轻量原生实现
你可以自行实现一个递归校验函数,完全对齐PostgreSQL @>算子的核心规则:基础值严格相等、对象递归校验所有匹配键、数组校验子集(不关心顺序),代码如下:
function contains(target, pattern) { // 基础类型、null/undefined直接判等 if (pattern === null || typeof pattern !== 'object') { return Object.is(target, pattern); } // 数组匹配逻辑:模式数组的每一项都能在目标数组中找到匹配项 if (Array.isArray(pattern)) { if (!Array.isArray(target)) return false; return pattern.every(patternItem => target.some(targetItem => contains(targetItem, patternItem)) ); } // 对象匹配逻辑:模式对象的每一个键都在目标对象中存在且值匹配 return Object.keys(pattern).every(key => Object.prototype.hasOwnProperty.call(target, key) && contains(target[key], pattern[key]) ); }
测试验证
运行你给出的示例会返回符合预期的结果:
const result = contains( { "foo": [1, 2, 3], "bar": "baz" }, { "foo": [3, 1] } ); console.log(result); // 输出 true
如果需要调整数组匹配规则为严格顺序匹配,只需要把数组分支的逻辑改为按索引逐位递归校验即可。
第三方库方案
如果不需要自定义规则,也可以直接使用npm上专门对齐PostgreSQL JSON包含规则的公开包,不用自己维护边界case处理逻辑。
内容的提问来源于stack exchange,提问作者Anton Strogonoff
相关产品推荐
相关产品推荐

