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

JavaScript多对象字段匹配 如何实现跨字段多关键词组合过滤

问题根因

原有过滤逻辑将输入的filterText作为完整字符串,在单个产品字段中做全量匹配。当传入跨字段组合关键词时,不存在任何一个指定字段能完整包含整段拼接的搜索内容,因此返回空数组。

兼容方案

不需要改动原有单字段过滤的核心匹配逻辑,只需要在匹配前先对输入文本做关键词拆分,再校验所有拆分出的关键词都能在产品的任意指定字段中命中即可。单关键词场景下拆分后仅1个关键词,匹配逻辑和原有效果完全一致,不会破坏原有功能。

实现代码

const products = [
  {id: 0, name: "Product1", brand: "Theraflu", itemCode: "THE110", price: 5.45},
  {id: 1, name: "Product2", brand: "Benadryl", itemCode: "BEN121", price: 7.05},
  {id: 2, name: "Product3", brand: "Listerine", itemCode: "LIS204", price: 4.55},
  {id: 3, name: "Product4", brand: "Tylenol", itemCode: "TYL116", price: 6.10},
];

const keys = ["name", "brand", "itemCode"];

const getFilteredProducts = (filterText) => {
  // 按空白字符拆分关键词,统一转小写后过滤空值,兼容多空格、首尾空格场景
  const keywords = filterText.toLowerCase().split(/\s+/).filter(Boolean);
  
  return products.filter(product => {
    // 要求所有关键词都能命中至少一个指定字段,满足组合匹配需求
    return keywords.every(keyword => {
      return keys.some(field => product[field].toLowerCase().includes(keyword));
    });
  });
}

// 单关键词测试:返回id=3的Tylenol产品,和原有逻辑结果一致
console.log(getFilteredProducts("Tylenol"));
// 跨字段组合关键词测试:正常返回id=3的Product4
console.log(getFilteredProducts("product4 Tylenol"));

逻辑说明

  • 采用正则/\s+/拆分搜索文本,可自动适配用户输入多个连续空格、搜索内容首尾带空格的场景,鲁棒性优于固定空格拆分
  • 用every校验所有关键词均命中,符合常规组合搜索"所有搜索条件都满足"的预期;如果后续需要实现"任意关键词命中即返回"的宽松匹配,仅需将every替换为some即可
  • 核心的单字段匹配逻辑完全保留,没有修改原有判断规则,不会对已上线的单关键词搜索功能造成影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:27:29