RxJS:如何用规则对象数组判断单个对象是否符合条件并加入数组?
用RxJS操作符实现对象规则校验并收集结果
实现思路
- 将目标对象转为Observable流,利用RxJS操作符完成校验逻辑
- 定义规则校验函数,区分正则匹配和普通值全等对比两种场景
- 使用
filter过滤符合规则的对象,tap执行结果收集的副作用
完整代码实现
import { of } from 'rxjs'; import { filter, tap } from 'rxjs/operators'; // 目标对象 const pnt = { "pnt_name": "P1101_HT01", "base": 1 }; // 校验规则数组 const rules = [ { "key": "pnt_name", "value": "P.*" }, { "key": "base", "value": 1 } ]; // 存储符合条件的对象数组 const positiveArray = []; // 校验函数:判断对象是否符合任一规则 const matchesAnyRule = (obj, rules) => { return rules.some(rule => { const objValue = obj[rule.key]; // 字符串类型规则当作正则处理 if (typeof rule.value === 'string') { const regex = new RegExp(rule.value); return regex.test(objValue); } // 非字符串类型直接做全等校验 return objValue === rule.value; }); }; // RxJS流处理逻辑 of(pnt).pipe( // 过滤出符合规则的对象 filter(obj => matchesAnyRule(obj, rules)), // 将符合条件的对象推入目标数组 tap(validObj => positiveArray.push(validObj)) ).subscribe(() => { // 订阅触发执行,此时可查看结果数组 console.log('符合条件的对象数组:', positiveArray); });
关键说明
of(pnt):把单个对象包装成Observable流,这是RxJS处理数据的基础filter:核心校验环节,只保留通过matchesAnyRule校验的对象tap:执行副作用操作(向数组添加元素),不会修改流中的数据- 订阅流:RxJS是惰性执行模型,只有调用
subscribe后才会启动整个处理流程
内容的提问来源于stack exchange,提问作者K N
相关产品推荐
相关产品推荐

