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

如何修改filterByValue函数实现嵌套对象与数组的字符串搜索

实现支持数组与嵌套对象的深度筛选函数filterByValue

需求背景

现有对象数组input,每个对象包含vertical(字符串)、platformList(数组)、radar_metadata(嵌套对象)三类属性。原filterByValue函数仅能筛选顶层属性的字符串,无法搜索数组元素、嵌套对象中的子串(如“Ident”“Clos”),需修改函数实现深度搜索能力。


解决方案:递归遍历所有层级数据

核心思路是通过递归函数,遍历对象的所有属性值,包括数组元素和嵌套对象,逐一检查是否包含目标搜索字符串。

原函数(仅支持顶层属性)

// 原函数:仅筛选顶层字符串属性
function filterByValue(input, searchTerm) {
  return input.filter(item => {
    return Object.values(item).some(val => 
      typeof val === 'string' && val.includes(searchTerm)
    );
  });
}

修改后的深度筛选函数

// 修改后:支持数组、嵌套对象的深度搜索
function filterByValue(input, searchTerm) {
  // 递归检查单个值是否匹配搜索词
  const matchesSearch = (value) => {
    const lowerSearch = searchTerm.toLowerCase();
    // 字符串类型:大小写不敏感匹配
    if (typeof value === 'string') {
      return value.toLowerCase().includes(lowerSearch);
    }
    // 数组类型:遍历每个元素递归检查
    if (Array.isArray(value)) {
      return value.some(item => matchesSearch(item));
    }
    // 嵌套对象:遍历所有属性值递归检查
    if (typeof value === 'object' && value !== null) {
      return Object.values(value).some(val => matchesSearch(val));
    }
    // 其他类型(数字、布尔等)不参与匹配
    return false;
  };

  return input.filter(item => matchesSearch(item));
}

代码说明

  1. 递归辅助函数matchesSearch:

    • 字符串:统一转小写实现大小写不敏感搜索(若需区分大小写,移除toLowerCase()即可)
    • 数组:用some遍历每个元素,递归调用检查
    • 嵌套对象:遍历对象的所有属性值,递归调用检查
    • 非字符串/数组/对象类型:直接返回false
  2. 使用示例

// 测试用input数组
const input = [
  {
    vertical: "Aviation",
    platformList: ["Aircraft", "Radar System"],
    radar_metadata: {
      identifier: "RAD-123",
      location: "Closure Area"
    }
  },
  {
    vertical: "Marine",
    platformList: ["Ship", "Buoy"],
    radar_metadata: {
      identifier: "MAR-456",
      location: "Open Sea"
    }
  }
];

// 搜索"Ident" → 匹配第一个对象(radar_metadata.identifier包含)
console.log(filterByValue(input, "Ident"));
// 搜索"Clos" → 匹配第一个对象(radar_metadata.location包含)
console.log(filterByValue(input, "Clos"));
// 搜索"Ship" → 匹配第二个对象(platformList包含)
console.log(filterByValue(input, "Ship"));

可选扩展

  • 若需支持数字转字符串匹配,可在辅助函数中添加:
    if (typeof value === 'number') {
      return value.toString().includes(searchTerm);
    }
    
  • 若数据存在循环引用,需添加循环引用检测(比如用Set记录已访问的对象),避免死循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:22:36