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

如何在Angular中用JavaScript的.filter()方法按多属性过滤对象列表?

Angular中使用filter()实现多条件模糊过滤的正确方式

原始数据列表

[
  {id: 97, name: 'create', obeName: 'None', version: '5.1', versionNum: 5.1},
  {id: 7, name: 'fare', obeName: 'None', version: '7.3', versionNum: 7.3},
  {id: 1324, name: 'serach_flyer', obeName: 'None', version: '9.1', versionNum: 9.1},
  {id: 24, name: 'PNR_AddFrequentFlyer', obeName: 'None', version: '12.1', versionNum: 12.1},
  {id: 14, name: 'price booking', obeName: 'Availability', version: '18.1', versionNum: 18.1},
  {id: 2644, name: 'downline', obeName: 'None', version: '2.7', versionNum: 2.7},
  {id: 235921, name: 'airline service', obeName: 'None', version: '1.0', versionNum: 1}
]

过滤条件

const ob = {name: 'airline', version: '1.4'}

现有代码(存在问题)

list.filter(
  data => {
    for (var prop in ob) {
      if (Object.prototype.hasOwnProperty.call(ob, prop)) {
        if( typeof ob[prop] === 'string'){
          ob[prop].toLowerCase().includes(data[prop].toLowerCase())
        }
        else{
            ob[prop].includes(data[prop])}
}})

正确实现方式

你的现有代码存在三个关键问题:

  • 没有返回布尔值:filter的回调函数必须返回true/false来决定是否保留当前项,你的代码没有任何返回语句
  • 多条件逻辑错误:需要确保所有过滤条件都匹配才保留数据,只要有一个条件不满足就应该排除
  • 类型处理不当:version字段是字符串,你错误地用了数字的includes方法(数字没有这个方法),且未处理大小写敏感问题

方案1:全字段模糊匹配

如果需求是name包含"airline"、version包含"1.4"的模糊匹配,可用以下代码:

const filteredList = list.filter(data => {
  // 遍历所有过滤条件
  for (const prop in ob) {
    if (Object.prototype.hasOwnProperty.call(ob, prop)) {
      const filterVal = ob[prop];
      const dataVal = data[prop];

      // 数据中无该属性则直接排除
      if (!dataVal) return false;

      // 统一转字符串并小写,避免大小写敏感,兼容数字类型
      const filterStr = String(filterVal).toLowerCase();
      const dataStr = String(dataVal).toLowerCase();

      // 当前条件不匹配,立即排除该数据
      if (!dataStr.includes(filterStr)) {
        return false;
      }
    }
  }
  // 所有条件都满足,保留该数据
  return true;
});

方案2:版本号精确比较(如筛选版本≥1.4的数据)

如果需求是name包含"airline"且version大于等于1.4,需要单独处理版本号的比较逻辑:

// 辅助函数:比较两个版本号,返回1/0/-1分别代表v1>v2、相等、v1<v2
function compareVersions(v1, v2) {
  const v1Parts = String(v1).split('.').map(Number);
  const v2Parts = String(v2).split('.').map(Number);
  const maxLen = Math.max(v1Parts.length, v2Parts.length);

  for (let i = 0; i < maxLen; i++) {
    const num1 = v1Parts[i] || 0;
    const num2 = v2Parts[i] || 0;
    if (num1 > num2) return 1;
    if (num1 < num2) return -1;
  }
  return 0;
}

const filteredList = list.filter(data => {
  for (const prop in ob) {
    if (Object.prototype.hasOwnProperty.call(ob, prop)) {
      const filterVal = ob[prop];
      const dataVal = data[prop];

      if (!dataVal) return false;

      if (prop === 'version') {
        // 版本号小于过滤条件,排除
        if (compareVersions(dataVal, filterVal) < 0) {
          return false;
        }
      } else {
        // 其他字段做模糊匹配
        const filterStr = String(filterVal).toLowerCase();
        const dataStr = String(dataVal).toLowerCase();
        if (!dataStr.includes(filterStr)) {
          return false;
        }
      }
    }
  }
  return true;
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:51:36