当前位置:首页 > 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 提供了多种数据渲染的方式,包括插值表达式、指令和计算属性等。以下是常见的实现方法: 插值表达式 使用双大括号 {{ }} 将数据绑定到模板中,数据变化时会自…

vue数据劫持实现

vue数据劫持实现

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

vue实现数据翻译

vue实现数据翻译

Vue 实现数据翻译的方法 在 Vue 项目中实现数据翻译(国际化)通常需要结合国际化库或自定义方案。以下是几种常见的方法: 使用 vue-i18n 库 安装 vue-i18n 库: npm in…

vue数据代理底层实现

vue数据代理底层实现

Vue 数据代理的底层实现原理 Vue 的数据代理是通过 Object.defineProperty 或 Proxy(Vue 3)实现的,将数据对象的属性代理到 Vue 实例上,使得可以直接通过 th…

Vue数据依赖实现

Vue数据依赖实现

Vue数据依赖实现原理 Vue的数据依赖实现基于响应式系统,核心是通过Object.defineProperty或Proxy拦截数据变化,结合发布-订阅模式实现依赖收集和更新触发。 核心机制 依赖…

vue数据劫持实现

vue数据劫持实现

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