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

如何更优地过滤含固定条件与动态条件的对象数组以避免代码重复

如何更优地过滤含固定条件与动态条件的对象数组以避免代码重复

嘿,我太懂你这种不想一遍遍复制粘贴过滤代码的烦恼了!针对你给出的对象数组场景,咱们可以通过封装通用过滤逻辑的方式,彻底解决代码重复的问题,不管是固定条件还是动态变化的过滤需求,都能轻松复用。

先把你的示例数组贴出来方便参考:

const arr = [
  {
    "no": 11145,
    "stringers": "P1",
    "ribs": "R1",
    "description": "some text"
  },
  {
    "no": 14568,
    "stringers": "P1",
    "ribs": "R1",
    "description": "some text"
  },
  {
    "no": 24562,
    "stringers": "P2",
    "ribs": "R9",
    "description": "some text"
  },
  {
    "no": 658741,
    "stringers": "P1",
    "ribs": "R2",
    "description": "some text"
  },
  {
    "no": 325690,
    "stringers": "P4",
    "ribs": "R5",
    "description": "some text"
  },
  {
    "no": 9745201,
    "stringers": "P1",
    "ribs": "R2",
    "description": "some text"
  }
];

方案1:封装键值对匹配的通用过滤函数

如果你的过滤需求大多是“匹配某个字段的固定值/可选值列表”,可以写一个接收条件对象的通用函数:

function filterArray(arr, filters) {
  return arr.filter(item => {
    // 遍历所有传入的过滤条件,确保每一项都匹配
    return Object.keys(filters).every(key => {
      // 支持单个值匹配,也支持多值列表匹配
      if (Array.isArray(filters[key])) {
        return filters[key].includes(item[key]);
      }
      return item[key] === filters[key];
    });
  });
}

调用示例:

  • 过滤stringers为P1且ribs为R1的项:
const result1 = filterArray(arr, { stringers: "P1", ribs: "R1" });
  • 过滤stringers为P1或P2的项:
const result2 = filterArray(arr, { stringers: ["P1", "P2"] });

方案2:支持自定义复杂条件的通用函数

如果需要更灵活的过滤逻辑(比如数值范围、模糊匹配等),可以让函数接收一个自定义判断函数:

function filterWithCustomLogic(arr, conditionFn) {
  return arr.filter(conditionFn);
}

调用示例:

  • 过滤no大于100000的项:
const result3 = filterWithCustomLogic(arr, item => item.no > 100000);

方案3:结合两种方式的终极灵活版

要是你想同时兼顾固定键值匹配和自定义逻辑,可以把两种方案结合起来:

function flexibleFilter(arr, filters = {}, customCondition = () => true) {
  return arr.filter(item => {
    // 先匹配键值对条件
    const matchesFilters = Object.keys(filters).every(key => {
      if (Array.isArray(filters[key])) {
        return filters[key].includes(item[key]);
      }
      return item[key] === filters[key];
    });
    // 再叠加自定义条件
    return matchesFilters && customCondition(item);
  });
}

调用示例:

  • 过滤stringers为P1且no大于10000的项:
const result4 = flexibleFilter(arr, { stringers: "P1" }, item => item.no > 10000);

这样一来,不管后续有什么新的过滤需求,你只需要传入对应的条件参数就行,再也不用重复写filter的核心逻辑啦!

备注:内容来源于stack exchange,提问作者Sebbo85

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:08:04