Skip to content

Basic Filtering ​

Learn the fundamentals of filtering with @mcabreradev/filter.

Introduction ​

@mcabreradev/filter provides a declarative, type-safe way to filter arrays using operator-based expressions.

Simple Equality ​

Basic Equality Check ​

typescript
import { filter } from '@mcabreradev/filter';

const users = [
  { name: 'John', age: 25, status: 'active' },
  { name: 'Jane', age: 30, status: 'inactive' },
  { name: 'Bob', age: 35, status: 'active' }
];

const expression = {
  status: { $eq: 'active' }
};

const result = filter(users, expression);

Multiple Properties ​

typescript
const expression = {
  status: { $eq: 'active' },
  age: { $eq: 25 }
};

Comparison Operators ​

Greater Than / Less Than ​

typescript
const expression = {
  age: { $gt: 25 }
};

const expression = {
  age: { $gte: 25 }
};

const expression = {
  age: { $lt: 30 }
};

const expression = {
  age: { $lte: 30 }
};

Not Equal ​

typescript
const expression = {
  status: { $ne: 'deleted' }
};

Range Queries ​

typescript
const expression = {
  $and: [
    { age: { $gte: 18 } },
    { age: { $lte: 65 } }
  ]
};

String Operators ​

Contains ​

typescript
const expression = {
  name: { $contains: 'john' }
};

Starts With / Ends With ​

typescript
const expression = {
  email: { $endsWith: '@example.com' }
};

const expression = {
  username: { $startsWith: 'user_' }
};

Regular Expressions ​

typescript
const expression = {
  name: { $regex: /john/i }
};

const expression = {
  email: { $regex: /^[a-z]+@example\.com$/ }
};

Array Operators ​

In Array ​

typescript
const expression = {
  role: { $in: ['admin', 'moderator', 'user'] }
};

Not In Array ​

typescript
const expression = {
  status: { $nin: ['deleted', 'banned'] }
};

Array Contains ​

typescript
const users = [
  { name: 'John', tags: ['javascript', 'react'] },
  { name: 'Jane', tags: ['python', 'django'] }
];

const expression = {
  tags: { $contains: 'javascript' }
};

Logical Operators ​

AND Operator ​

typescript
const expression = {
  $and: [
    { age: { $gte: 18 } },
    { status: { $eq: 'active' } },
    { role: { $in: ['admin', 'user'] } }
  ]
};

OR Operator ​

typescript
const expression = {
  $or: [
    { role: { $eq: 'admin' } },
    { permissions: { $contains: 'write' } }
  ]
};

NOT Operator ​

typescript
const expression = {
  $not: {
    status: { $eq: 'deleted' }
  }
};

Complex Combinations ​

typescript
const expression = {
  $and: [
    {
      $or: [
        { role: { $eq: 'admin' } },
        { role: { $eq: 'moderator' } }
      ]
    },
    { status: { $eq: 'active' } },
    {
      $not: {
        email: { $endsWith: '@blocked.com' }
      }
    }
  ]
};

Nested Objects ​

Dot Notation ​

typescript
const users = [
  {
    name: 'John',
    address: {
      city: 'New York',
      country: 'USA'
    }
  }
];

const expression = {
  'address.city': { $eq: 'New York' }
};

Nested Object Syntax ​

typescript
const expression = {
  address: {
    city: { $eq: 'New York' },
    country: { $eq: 'USA' }
  }
};

Deep Nesting ​

typescript
const expression = {
  'profile.settings.notifications.email': { $eq: true }
};

Working with Null and Undefined ​

Check for Null ​

typescript
const expression = {
  deletedAt: { $eq: null }
};

Check for Not Null ​

typescript
const expression = {
  deletedAt: { $ne: null }
};

Handle Optional Properties ​

typescript
const users = [
  { name: 'John', age: 25 },
  { name: 'Jane' },
  { name: 'Bob', age: null }
];

const expression = {
  age: { $ne: null }
};

Type Safety with TypeScript ​

Define Interfaces ​

typescript
interface User {
  id: number;
  name: string;
  age: number;
  status: 'active' | 'inactive';
  email: string;
}

const expression: Expression<User> = {
  status: { $eq: 'active' },
  age: { $gte: 18 }
};

Type-Safe Expressions ​

typescript
import type { Expression } from '@mcabreradev/filter';

const createUserFilter = (minAge: number): Expression<User> => ({
  $and: [
    { age: { $gte: minAge } },
    { status: { $eq: 'active' } }
  ]
});

Common Patterns ​

Active Records ​

typescript
const ACTIVE_EXPRESSION = {
  $and: [
    { status: { $eq: 'active' } },
    { deletedAt: { $eq: null } }
  ]
};

Search Pattern ​

typescript
const createSearchExpression = (term: string) => ({
  $or: [
    { name: { $regex: new RegExp(term, 'i') } },
    { email: { $regex: new RegExp(term, 'i') } },
    { username: { $regex: new RegExp(term, 'i') } }
  ]
});

Date Range Pattern ​

typescript
const createDateRangeExpression = (start: Date, end: Date) => ({
  $and: [
    { createdAt: { $gte: start } },
    { createdAt: { $lte: end } }
  ]
});

Permission Check Pattern ​

typescript
const createPermissionExpression = (requiredPermissions: string[]) => ({
  $or: [
    { role: { $eq: 'admin' } },
    {
      permissions: {
        $in: requiredPermissions
      }
    }
  ]
});

Performance Tips ​

Use Specific Operators ​

typescript
const expression = {
  status: { $eq: 'active' }
};

const expression = {
  status: { $regex: /active/ }
};

Avoid Nested OR Operations ​

typescript
const expression = {
  $or: [
    { $or: [{ a: 1 }, { b: 2 }] },
    { $or: [{ c: 3 }, { d: 4 }] }
  ]
};

const expression = {
  $or: [
    { a: 1 },
    { b: 2 },
    { c: 3 },
    { d: 4 }
  ]
};

Use $in Instead of Multiple $or ​

typescript
const expression = {
  $or: [
    { status: { $eq: 'active' } },
    { status: { $eq: 'pending' } },
    { status: { $eq: 'approved' } }
  ]
};

const expression = {
  status: { $in: ['active', 'pending', 'approved'] }
};

Next Steps ​

Released under the MIT License.