113 lines
2.9 KiB
Markdown
113 lines
2.9 KiB
Markdown
# JS Filter
|
||
|
||
轻量、易读、可解析、可执行的类 SQL 过滤语法,用于 JavaScript 数组过滤。
|
||
|
||
## 语法特性
|
||
|
||
- **WHERE**: 条件过滤
|
||
- **ORDER BY**: 排序
|
||
- **LIMIT**: 限制结果数量
|
||
- **操作符**: `=`, `!=`, `>`, `<`, `>=`, `<=`, `IN`, `CONTAINS`, `LIKE`, `NOT LIKE`, `IS NULL`, `IS NOT NULL`
|
||
- **逻辑**: `AND`, `OR`
|
||
|
||
## 语法示例
|
||
|
||
```javascript
|
||
// 基础过滤
|
||
filter(users, "WHERE metadata.type = 'user'");
|
||
|
||
// 多条件
|
||
filter(users, "WHERE metadata.tags CONTAINS 'premium' AND metadata.region = 'beijing'");
|
||
|
||
// 排序
|
||
filter(users, "WHERE metadata.type = 'user' ORDER BY metadata.created_at DESC");
|
||
|
||
// 限制数量
|
||
filter(users, "WHERE metadata.type = 'user' ORDER BY metadata.created_at DESC LIMIT 10");
|
||
|
||
// IN 操作
|
||
filter(users, "WHERE metadata.region IN ['beijing', 'shanghai']");
|
||
|
||
// LIKE 操作 (支持 % 匹配任意字符,_ 匹配单个字符)
|
||
filter(products, "WHERE name LIKE '%Apple%'");
|
||
filter(products, "WHERE name LIKE 'Apple%'");
|
||
filter(products, "WHERE name LIKE '%Phone'");
|
||
|
||
// NOT LIKE 操作 (排除匹配模式的项)
|
||
filter(products, "WHERE name NOT LIKE '%Apple%'");
|
||
|
||
// IS NULL 操作 (匹配 null 或 undefined 的值)
|
||
filter(users, "WHERE email IS NULL");
|
||
|
||
// IS NOT NULL 操作 (匹配非 null 且非 undefined 的值)
|
||
filter(users, "WHERE email IS NOT NULL");
|
||
```
|
||
|
||
## 使用方法
|
||
|
||
```javascript
|
||
import { filter } from '@kevisual/js-filter';
|
||
|
||
const users = [
|
||
{
|
||
metadata: {
|
||
tags: ['premium', 'active'],
|
||
type: 'user',
|
||
region: 'beijing',
|
||
created_at: '2024-03-15T10:00:00Z',
|
||
},
|
||
},
|
||
{
|
||
metadata: {
|
||
tags: ['free'],
|
||
type: 'admin',
|
||
region: 'shanghai',
|
||
created_at: '2024-01-10T09:00:00Z',
|
||
},
|
||
},
|
||
{
|
||
metadata: {
|
||
tags: ['enterprise', 'premium'],
|
||
type: 'user',
|
||
region: 'guangzhou',
|
||
created_at: '2024-04-05T12:00:00Z',
|
||
},
|
||
},
|
||
];
|
||
|
||
// 查找 premium 用户
|
||
const premiumUsers = filter(users, "WHERE metadata.tags CONTAINS 'premium'");
|
||
|
||
// 查找北京的用户,按创建时间倒序
|
||
const beijingUsers = filter(users, "WHERE metadata.region = 'beijing' ORDER BY metadata.created_at DESC");
|
||
```
|
||
|
||
## 新增操作符说明
|
||
|
||
### NOT LIKE
|
||
排除匹配指定模式的数据项。
|
||
|
||
```javascript
|
||
// 查找不包含 "Apple" 的产品
|
||
const nonAppleProducts = filter(products, "WHERE name NOT LIKE '%Apple%'");
|
||
```
|
||
|
||
### IS NULL / IS NOT NULL
|
||
检查字段值是否为 `null` 或 `undefined`。
|
||
|
||
```javascript
|
||
const usersWithNullEmail = [
|
||
{ name: 'Alice', email: 'alice@example.com', age: 25 },
|
||
{ name: 'Bob', email: null, age: 30 },
|
||
{ name: 'Charlie', email: undefined, age: 35 },
|
||
];
|
||
|
||
// 查找 email 为 null 或 undefined 的用户
|
||
const usersWithoutEmail = filter(usersWithNullEmail, "WHERE email IS NULL");
|
||
|
||
// 查找 email 不为 null 且不为 undefined 的用户
|
||
const usersWithEmail = filter(usersWithNullEmail, "WHERE email IS NOT NULL");
|
||
```
|
||
|
||
**注意**: `IS NULL` 和 `IS NOT NULL` 会同时检查 JavaScript 的 `null` 和 `undefined` 值。
|