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

如何基于动态键值对数组过滤对象数组?

解决方案:基于多条件同时匹配过滤对象数组

你的核心问题是当前代码实现了满足任一筛选条件的逻辑(OR),但需要的是同时满足所有筛选条件的逻辑(AND)。以下是两种可行的解决方案,包含原生JavaScript和Lodash实现:

一、原生JavaScript实现

直接利用数组的filter和every方法,检查每个对象是否符合所有筛选规则:

// 原筛选条件格式:{type: 2, style: 4}
const cleanedFilters = { type: 2, style: 4 };
// 将筛选条件转为键值对数组,方便遍历检查
const filterRules = Object.entries(cleanedFilters);

// 过滤目标数组,仅保留同时满足所有条件的对象
const result = searchResults.filter(item => {
  return filterRules.every(([key, expectedVal]) => {
    // 处理类型转换:将筛选值转为与对象属性一致的数字类型
    return item.hasOwnProperty(key) && item[key] === parseInt(expectedVal);
  });
});

逻辑说明

  • filter遍历目标数组的每个对象
  • every确保当前对象全部满足筛选规则中的键值匹配,只要有一个规则不满足就会被排除

二、Lodash实现(更简洁)

Lodash提供了更便捷的工具函数,根据是否需要类型转换分两种场景:

场景1:筛选值与对象属性类型一致(如均为数字)

直接使用_.filter配合_.matches:

const cleanedFilters = { type: 2, style: 4 };
const result = _.filter(searchResults, _.matches(cleanedFilters));

场景2:需要处理类型转换(如筛选值是字符串,对象属性是数字)

用_.every确保所有条件同时满足:

const cleanedFilters = { type: 2, style: 4 };
const result = _.filter(searchResults, item => {
  return _.every(cleanedFilters, (expectedVal, key) => {
    return item[key] === parseInt(expectedVal);
  });
});

原代码问题分析

你之前的map+filter+flatten逻辑,是把每个筛选条件单独过滤出的结果合并,本质是逻辑或(OR),所以会返回满足任一条件的对象。而every方法则是强制所有条件必须同时成立,实现**逻辑与(AND)**的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:27:17