当前位置:首页 > 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
  )
);

动态构建筛选条件

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

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
}));

处理复杂条件

对于包含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组件中实现多条件筛选:

js实现多条件筛选数据

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 的双向数据绑定主要通过 v-model 指令实现,它结合了 v-bind 和 v-on 的功能,能够同步表单输入和应用状态。 基本语法 在表单元素上使用 v-mo…

vue 实现数据分页

vue 实现数据分页

实现数据分页的基本思路 在Vue中实现数据分页通常需要结合前端分页逻辑和后端API支持。前端分页适合数据量较小的情况,后端分页适合大数据量场景。 前端分页实现 创建一个计算属性来分割当前页数据:…

vue数据实现

vue数据实现

Vue 数据实现的核心方法 Vue.js 通过数据驱动视图更新,其核心实现基于响应式系统。以下是实现数据绑定的关键方法: 数据声明与响应式原理 在 Vue 2.x 中,使用 Object.defin…

vue实现数据换行

vue实现数据换行

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

vue实现数据劫持

vue实现数据劫持

Vue 数据劫持的实现原理 Vue 的数据劫持主要通过 Object.defineProperty 或 Proxy 实现,用于监听数据变化并触发视图更新。 使用 Object.definePrope…

vue实现数据监听

vue实现数据监听

Vue 数据监听实现方式 Vue 提供了多种方式实现数据监听,核心机制基于响应式系统。以下是常见方法: 响应式属性(data 和 computed) 在组件选项中定义 data 返回对象,Vue 会…