【发布时间】:2021-06-06 04:46:25
【问题描述】:
我需要使用运算符“OR”和“AND”使用 TypeScript 构建一个通用过滤器。也应该有一种使用范围和多选过滤器的方法。 但是我是 OOP 的新手,不知道应该如何使用类。 对后端的过滤请求应该是这样的,如果有新类型,必须有一种方法来扩展它们:
[
{ field: 'id', operator: '=', value: 12 },
'OR',
{ field: 'name', operator: '=', value: 'testName' },
'OR',
[
{ field: 'age', operator: '>=', value: '20' },
'AND',
{ field: 'age', operator: '=<', value: '30' }
]
]
我形成了一个像这样的对象数组,并提供给一个形成过滤器的类:
[
{
field: 'id',
type: 'default',
value: 12
},
{
field: 'id2',
type: 'default',
value: 13
},
{
field: 'name',
type: 'default',
value: 'yulya'
},
{
field: 'age',
type: 'range',
value: '20 - 30'
}
]
FilterParameters 类看起来像这样,但是,它是不可扩展的:
export class FilterParameters {
filter: (string | object | number)[]
constructor() {
this.filter = []
}
createFilter(receivedFields: (object)[]) {
let filterArr:(object)[] = []
let defaultFilter = receivedFields.filter((item) => item.type === 'default')
let rangeFilter = receivedFields.filter(item => item.type === 'range')
defaultFilter.forEach((item:any) => {
let defaultFilterObj = {
field: item.field,
operator: '=',
value: item.value
}
filterArr.push(defaultFilterObj)
})
rangeFilter.forEach((item:any) => {
let conditionArr = []
let startCondition = item.value.split(' ')[0]
let endCondition = item.value.split(' ').pop()
let objStartCondition = {
field: item.field,
operator: '>=',
value: startCondition
}
let objEndCondition = {
field: item.field,
operator: '=<',
value: endCondition
}
conditionArr.push(objStartCondition)
conditionArr.push('AND')
conditionArr.push(objEndCondition)
filterArr.push(conditionArr)
})
this.filter = filterArr.map((e, i) => i < filterArr.length - 1 ? [e, 'OR'] : [e]).reduce((a, b) => a.concat(b))
return this.filter
}
}
如何创建一个可以形成过滤器并易于扩展的类?
【问题讨论】:
-
为什么要转换数组?如何用新数组表示
[{ field: 'id', operator: '=', value: 12 }, 'AND', { field: 'name', operator: '=', value: 'testName' }]或[{ field: 'percentage', operator: '>', value: '20.123' }, 'AND', { field: 'percentage', operator: '<', value: '20.124' }]? -
恕我直言,这种过滤器的简单表示是像
{ OR: [{ field: 'id', operator: '=', value: 12 }, {OR: [{ field: 'name', operator: '=', value: 'testName' }, AND: [{ field: 'age', operator: '>=', value: '20' }, { field: 'age', operator: '=<', value: '30' }]]}]}这样的二叉树。这也将阐明[{ field: 'id', operator: '=', value: 12 }, 'AND', { field: 'name', operator: '=', value: 'testName' }, 'OR', { field: 'age', operator: '>=', value: '20' }]等情况下的优先级。 -
这个过滤器的类型是
interface Or { OR: [Filter, Filter]; },interface And { AND: [Filter, Filter]; },type Filter = Or | And | { field: string; operator: string; value: string | number; }; -
我需要将数组
[ { field: 'name', type: 'default', value: 'yulya' }, { field: 'age', type: 'range', value: '20 - 30' } ]转换成[ { field: 'id', operator: '=', value: 12 }, 'OR', { field: 'name', operator: '=', value: 'testName' }, 'OR', [ { field: 'age', operator: '>=', value: '20' }, 'AND', { field: 'age', operator: '=<', value: '30' } ] ]发送到后端并接收响应 -
是否指定了优先级?后端对
[{ field: 'id', operator: '=', value: 12 }, 'AND', { field: 'name', operator: '=', value: 'testName' }, 'OR', { field: 'age', operator: '>=', value: '20' }]做了什么?先AND还是先OR还是从左到右还是从右到左?
标签: javascript typescript oop filter filtering