当前位置:首页 > JavaScript

js实现多条件筛选数据

2026-04-04 21:34:25JavaScript

多条件筛选数据的实现方法

使用 Array.filter() 方法

通过 Array.filter() 结合多个条件进行筛选。每个条件可以独立判断,最终合并为完整的筛选逻辑。

const data = [
  { name: 'Alice', age: 25, city: 'New York' },
  { name: 'Bob', age: 30, city: 'Los Angeles' },
  { name: 'Charlie', age: 28, city: 'New York' }
];

function filterData(data, filters) {
  return data.filter(item => {
    return Object.keys(filters).every(key => {
      if (filters[key] === '') return true; // 忽略空条件
      return item[key] === filters[key];
    });
  });
}

const filters = { city: 'New York', age: 25 };
const result = filterData(data, filters);
console.log(result); // 输出: [{ name: 'Alice', age: 25, city: 'New York' }]

动态构建筛选条件

允许条件动态增减,支持部分匹配或范围查询。

function dynamicFilter(data, conditions) {
  return data.filter(item => {
    return conditions.every(condition => {
      const { key, value, operator = '===' } = condition;
      switch (operator) {
        case '===': return item[key] === value;
        case '>': return item[key] > value;
        case '<': return item[key] < value;
        case 'includes': return String(item[key]).includes(value);
        default: return true;
      }
    });
  });
}

const conditions = [
  { key: 'city', value: 'New York' },
  { key: 'age', value: 26, operator: '<' }
];
const result = dynamicFilter(data, conditions);
console.log(result); // 输出: [{ name: 'Charlie', age: 28, city: 'New York' }]

使用高阶函数封装

将筛选逻辑抽象为高阶函数,支持更复杂的组合条件。

const and = (...fns) => item => fns.every(fn => fn(item));
const or = (...fns) => item => fns.some(fn => fn(item));

const filterByCity = city => item => item.city === city;
const filterByAge = age => item => item.age > age;

const combinedFilter = and(
  filterByCity('New York'),
  or(filterByAge(24), filterByAge(27))
);

const result = data.filter(combinedFilter);
console.log(result); // 输出符合条件的项

支持模糊搜索

通过正则表达式或字符串匹配实现模糊筛选。

function fuzzyFilter(data, keyword) {
  const regex = new RegExp(keyword, 'i');
  return data.filter(item => {
    return Object.values(item).some(value => 
      String(value).match(regex)
    );
  });
}

const result = fuzzyFilter(data, 'al');
console.log(result); // 输出包含 'al' 的项

性能优化

对于大数据量,可以使用索引或 Web Worker 分片处理。

js实现多条件筛选数据

// 使用索引优化
const index = {};
data.forEach((item, idx) => {
  Object.keys(item).forEach(key => {
    if (!index[key]) index[key] = {};
    const value = item[key];
    if (!index[key][value]) index[key][value] = [];
    index[key][value].push(idx);
  });
});

function indexedFilter(filters) {
  const matchedIndices = Object.keys(filters).map(key => {
    const value = filters[key];
    return index[key][value] || [];
  });
  const commonIndices = matchedIndices.reduce((a, b) => 
    a.filter(x => b.includes(x))
  );
  return commonIndices.map(idx => data[idx]);
}

以上方法覆盖了从基础到高级的多条件筛选需求,可根据实际场景选择或组合使用。

标签: 多条数据
分享给朋友:

相关文章

vue数据劫持实现

vue数据劫持实现

Vue 数据劫持的实现原理 Vue 的数据劫持主要通过 Object.defineProperty 或 Proxy 实现,用于监听数据变化并触发视图更新。以下是核心实现方式: 使用 Object.d…

vue实现数据翻译

vue实现数据翻译

Vue 数据翻译实现方案 在 Vue 项目中实现数据翻译通常涉及国际化(i18n)或多语言支持,以下是几种常见方法: 使用 vue-i18n 插件 安装 vue-i18n 依赖: npm inst…

vue实现数据动态

vue实现数据动态

Vue 实现数据动态绑定的方法 Vue.js 的核心特性之一是数据绑定,通过响应式系统实现数据的动态更新。以下是几种常见的实现方式: 双向数据绑定(v-model) 使用 v-model 指令可以实…

vue  实现数据滚动

vue 实现数据滚动

Vue 实现数据滚动的方法 使用 CSS 动画实现滚动 通过 CSS 的 animation 和 @keyframes 实现滚动效果,适用于简单的文字或数据滚动。 <template>…

vue实现数据更改

vue实现数据更改

Vue 数据更改的实现方法 Vue 提供了多种方式来响应式地更改数据,以下是几种常见的方法: 直接修改数据属性 在 Vue 实例中,可以直接修改 data 对象的属性,Vue 会自动检测这些变化并更…

vue实现数据换行

vue实现数据换行

使用 white-space CSS 属性 在 Vue 中,可以通过 CSS 的 white-space 属性控制文本换行。将样式设置为 white-space: pre-line 或 white-s…