当前位置:首页 > JavaScript

js实现多条件筛选数据

2026-01-31 05:36:47JavaScript

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

在JavaScript中,可以通过多种方式实现多条件筛选数据。以下是几种常见的方法:

使用Array.filter()方法

通过Array.filter()方法可以轻松实现多条件筛选。该方法会创建一个新数组,包含通过所提供函数测试的所有元素。

const data = [
  { id: 1, name: 'Apple', category: 'fruit', price: 1.2 },
  { id: 2, name: 'Carrot', category: 'vegetable', price: 0.8 },
  { id: 3, name: 'Banana', category: 'fruit', price: 1.5 }
];

const filters = {
  category: 'fruit',
  price: value => value < 1.4
};

const filteredData = data.filter(item => 
  Object.entries(filters).every(([key, condition]) => 
    typeof condition === 'function' 
      ? condition(item[key]) 
      : item[key] === condition
  )
);

动态构建筛选条件

对于更灵活的多条件筛选,可以动态构建筛选条件函数:

js实现多条件筛选数据

function multiFilter(data, conditions) {
  return data.filter(item => {
    for (const key in conditions) {
      if (conditions[key] === undefined) continue;
      if (typeof conditions[key] === 'function') {
        if (!conditions[key](item[key])) return false;
      } else {
        if (item[key] !== conditions[key]) return false;
      }
    }
    return true;
  });
}

const conditions = {
  category: 'fruit',
  price: price => price > 1
};
const result = multiFilter(data, conditions);

使用Lodash等工具库

Lodash提供了.filter和.conforms等方法简化多条件筛选:

import _ from 'lodash';

const filtered = _.filter(data, _.conforms({
  category: val => val === 'fruit',
  price: val => val < 1.4
}));

处理复杂条件

js实现多条件筛选数据

对于包含AND/OR逻辑的复杂条件,可以构建更复杂的筛选函数:

function complexFilter(data, conditions) {
  return data.filter(item => {
    const andConditions = conditions.and || [];
    const orConditions = conditions.or || [];

    const andPass = andConditions.every(cond => 
      Object.entries(cond).every(([key, val]) => 
        typeof val === 'function' ? val(item[key]) : item[key] === val
      )
    );

    const orPass = orConditions.length === 0 || 
      orConditions.some(cond => 
        Object.entries(cond).every(([key, val]) => 
          typeof val === 'function' ? val(item[key]) : item[key] === val
        )
      );

    return andPass && orPass;
  });
}

性能优化建议

对于大数据集,可以考虑以下优化措施:

  • 对数据进行预处理或索引
  • 使用Web Worker进行后台筛选
  • 实现延迟筛选或分批筛选
  • 使用Memoization缓存筛选结果

实际应用示例

以下是一个完整的示例,展示如何在React组件中实现多条件筛选:

function ProductList({ products }) {
  const [filters, setFilters] = useState({
    category: '',
    minPrice: 0,
    maxPrice: Infinity
  });

  const filteredProducts = products.filter(product => {
    return (
      (filters.category === '' || product.category === filters.category) &&
      product.price >= filters.minPrice &&
      product.price <= filters.maxPrice
    );
  });

  return (
    <div>
      {/* 筛选控件 */}
      <input 
        type="text" 
        placeholder="Category" 
        onChange={e => setFilters({...filters, category: e.target.value})}
      />
      <input 
        type="number" 
        placeholder="Min price" 
        onChange={e => setFilters({...filters, minPrice: Number(e.target.value)})}
      />
      <input 
        type="number" 
        placeholder="Max price" 
        onChange={e => setFilters({...filters, maxPrice: Number(e.target.value)})}
      />

      {/* 产品列表 */}
      {filteredProducts.map(product => (
        <div key={product.id}>
          <h3>{product.name}</h3>
          <p>Price: ${product.price}</p>
        </div>
      ))}
    </div>
  );
}

这些方法提供了从简单到复杂的多条件筛选实现方案,可以根据具体需求选择合适的方法。

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

相关文章

vue实现数据

vue实现数据

Vue 实现数据绑定的方法 Vue.js 提供了多种方式实现数据绑定,包括双向绑定、单向绑定以及动态数据绑定。以下是几种常见的实现方式: 双向数据绑定(v-model) 双向数据绑定通常用于表单元素…

Vue实现数据检验

Vue实现数据检验

Vue 数据校验的实现方法 在Vue中实现数据校验可以通过多种方式完成,以下是常见的几种方法: 使用Vue的内置指令 Vue提供了一些内置指令如v-model和v-bind可以结合HTML5的表单验…

vue实现数据动态

vue实现数据动态

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

vue实现数据修改

vue实现数据修改

Vue 数据修改方法 在 Vue 中修改数据通常通过以下几种方式实现,具体取决于数据的状态(如本地数据、Vuex 状态管理或组件间通信)。 修改本地组件数据 直接修改组件内的 data 属性。Vue…

vue实现数据太多

vue实现数据太多

处理 Vue 中大数据量的优化方案 虚拟滚动(Virtual Scrolling) 使用 vue-virtual-scroller 或 vxe-table 等库实现虚拟滚动,仅渲染可视区域内的 DOM…

vue实现提交数据

vue实现提交数据

使用表单提交数据 在Vue中可以通过v-model绑定表单数据,结合@submit事件处理提交逻辑。以下是一个基础表单提交示例: <template> <form @submi…