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

基于与逻辑(&&)过滤含字符串数组的对象数组:SiteType多条件筛选

嘿,这问题我之前做项目时刚好碰到过,给你一步步拆解实现思路,保证清晰好用!

先明确需求核心

你需要完成两个层级的过滤:

  • 第一关:基于位置选择结果,先把主数据里对应位置的项筛出来
  • 第二关:对筛过位置的数据,再用多选的Problem Type做「逻辑与」过滤——也就是只有当某个项的SiteType包含所有选中的Problem Type时,才保留它
先假设数据结构(方便你对应自己的真实数据)

先拿一个贴近你场景的示例数据举例,你可以直接替换成自己的真实字段:

// 你的主数据数组
const mainData = [
  {
    id: 1,
    location: "纽约",
    siteType: {
      problemTypes: ["Access", "Tools", "Safety"]
    }
  },
  {
    id: 2,
    location: "伦敦",
    siteType: {
      problemTypes: ["Access", "Cleaning"]
    }
  },
  {
    id: 3,
    location: "纽约",
    siteType: {
      problemTypes: ["Tools", "Safety"]
    }
  },
  {
    id: 4,
    location: "纽约",
    siteType: {
      problemTypes: ["Access", "Tools"]
    }
  }
];

// 假设位置选择结果
const selectedLocation = "纽约";
// 多选后的Problem Type数组
const selectedProblemTypes = ['Access','Tools'];
实现过滤逻辑

1. 单独实现位置过滤

这一步比较直接,用数组的filter方法匹配location字段就行:

// 先筛出对应位置的数据
const locationFilteredData = mainData.filter(item => item.location === selectedLocation);

2. 重点:实现「逻辑与」的Problem Type过滤

这里不能直接用includes(它是「逻辑或」,只要包含其中一个就通过),我们需要的是所有选中的类型都必须存在,这时候用Array.every()就完美适配——它会遍历选中的类型数组,只有当每一个类型都满足条件时,才返回true:

// 对位置过滤后的数据,再做Problem Type的与逻辑过滤
const finalFilteredData = locationFilteredData.filter(item => {
  // 检查选中的每一个Problem Type,都在当前项的problemTypes数组里
  return selectedProblemTypes.every(type => item.siteType.problemTypes.includes(type));
});

3. 合并成一步(更简洁)

你也可以把两个过滤条件写到同一个filter回调里,减少中间变量:

const finalFilteredData = mainData.filter(item => {
  // 位置匹配 并且 所有选中的Problem Type都存在
  return item.location === selectedLocation && 
         selectedProblemTypes.every(type => item.siteType.problemTypes.includes(type));
});

额外优化:处理空选情况

如果用户没选任何Problem Type,我们应该跳过这个过滤条件,直接保留所有位置匹配的项,加个判断就行:

const finalFilteredData = mainData.filter(item => {
  // 位置匹配判断
  const isLocationMatch = item.location === selectedLocation;
  // 空选时直接通过,否则走与逻辑判断
  const isProblemTypeMatch = selectedProblemTypes.length === 0 
    ? true 
    : selectedProblemTypes.every(type => item.siteType.problemTypes.includes(type));
  
  return isLocationMatch && isProblemTypeMatch;
});
测试结果

用上面的示例数据,最终筛选出来的会是id为1和4的项,因为它们既在纽约,又同时包含Access和Tools两个类型,完全符合你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:12:51