
本文介绍一种简洁高效的 javascript 方法,用于从一个 json 对象数组中筛选出所有键值对的值均存在于另一组参考值(来自第二个 json 数组)中的对象。适用于药物相互作用、权限匹配等需严格值对校验的场景。
本文介绍一种简洁高效的 javascript 方法,用于从一个 json 对象数组中筛选出所有键值对的值均存在于另一组参考值(来自第二个 json 数组)中的对象。适用于药物相互作用、权限匹配等需严格值对校验的场景。
在实际开发中,我们常需判断一组结构化数据(如药物配对规则)是否完全由已知有效项构成。例如,给定 wechselwirkungen(相互作用列表),每个对象含两个编号字段 "1" 和 "2";再给定 medArray(有效药品编码列表),我们需要找出其中所有值(即 "1" 和 "2" 的取值)都出现在 medArray 的 Code 字段中的对象。
核心思路是:
-
提取所有有效参考值:从
medArray中映射出所有Code值,形成一个扁平数组(如[1234, 5678, 2222]); -
逐对象校验:对
wechselwirkungen中每个对象,获取其全部values(),并使用.every()确保每个值都在参考值数组中存在; - 过滤保留匹配项:仅返回全部值均通过校验的对象。
以下是完整可运行代码:
const wechselwirkungen = [
{ "1": 1234, "2": 5678 },
{ "1": 2222, "2": 1111 },
{ "1": 2222, "2": 5678 }
];
const medArray = [
{ Code: 1234 },
{ Code: 5678 },
{ Code: 2222 }
];
// 步骤1:提取所有合法Code值
const validCodes = medArray.map(item => item.Code);
// 步骤2 & 3:过滤wechselwirkungen中"所有值均在validCodes内"的对象
const result = wechselwirkungen.filter(obj =>
Object.values(obj).every(value => validCodes.includes(value))
);
console.log(result);
// 输出:[{ "1": 1234, "2": 5678 }, { "1": 2222, "2": 5678 }]
✅ 关键优势:
- 避免嵌套循环的 O(n×m) 复杂度,时间复杂度优化为 O(n×k),其中 k 是单个对象的键数量(此处恒为 2);
- 使用
Object.values()自动适配任意键名(不依赖"1"/"2"硬编码),增强健壮性; - 函数式写法清晰表达意图,便于复用与单元测试。
⚠️ 注意事项:
- 若对象含多余字段(如
"3": 9999),.every()会要求该值也存在于validCodes中——如只需校验特定键,请改用["1", "2"].every(key => validCodes.includes(obj[key])); - 数值比较为严格相等(
===),确保类型一致(如避免字符串"1234"误匹配数字1234); - 大规模数据下,建议将
validCodes转为Set提升includes性能:const codeSet = new Set(validCodes); … codeSet.has(value)。
此方法兼顾可读性、性能与扩展性,是处理多值联合校验任务的推荐实践。











