最笨的办法当然就是写几个条件分支来组装最终的查询条件,例如:
```javascript
const filter = { nickname: { $regex: nicknameReg } }
if (!!id) fiter._id = ObjectId(id)
if (!!status) fiter.status = status
const findList = await userModel.find(filter)
```
---
其实这是一个如何让编码更加优雅的问题,不只适用于此处你这个问题,如果从事`JavaScript`开发,建议了解下函数式编程,这里以函数式编程库 [ramda](
https://ramda.cn/) 为例,看看写出来又是怎样的:
<br/>
首先定义一个通用的纯函数 `omitNil`
```javascript
const { reject, isNil } = require('ramda')
const omitNil = reject(isNil)
```
做个解释:
`isNil` 和 `reject` 都是 **ramda** 直接提供的函数,并且 **ramda** 的函数都是自动柯里化的;
`isNil` 的作用:检测输入值是否为 `null` 或 `undefined`;
`reject` 的作用:可视为 `filter` 的补操作,简言之 `filter` 是留下满足条件的元素、`reject` 是排除满足条件的元素;
将 `reject` 和 `isNil` 进行组合,得到 `omitNil` 函数,它的作用是:排除掉值为 `null` 或 `undefined` 的元素
做一个简单直观的测试,看看 `omitNil` 函数的作用:
```javascript
const obj = { a: 1, b: null, c: undefined }
omitNil(obj) // => { a: 1 }
obj // => { a: 1, b: null, c: undefined }
const arr = [1, null, undefined]
omitNil(arr) // => [ 1 ]
arr // => [1, null, undefined]
```
可以看到,`omitNil` 的返回值和输入参数相比,少了值为 `null` 或 `undefined` 的元素,并且没有修改原输入参数
<br/>
**现在回到楼主的问题**,就可以一行代码实现了:
```javascript
const findList = await userModel.find(omitNil({ nickname: { $regex: nicknameReg }, _id: id, status }))
```
<br/>
最后,**ramda** 的核心设计理念就包含了:数据不变性和函数无副作用,因此以上纯函数均不会改变输入参数的值。
<br/>
> 参考:
>
>
https://ramda.cn>
>
https://ramdajs.com/