不使用Eval()实现条件动态求值:Like运算符报错排查
问题分析与修复
你的报错根源是字符串没有test方法,test是正则表达式对象的专属方法。你当前的like函数错误调用了字符串的test方法,而且硬编码的正则/y/不会把变量y解析成实际传入的匹配值。
不需要在filter代码块里单独处理Like运算符,只需要修正conditions里的like实现即可:
const conditionalArray = [ { name: "fridge", condition: "like", value: "sam" }, ]; const dataTofilter = [ { line: "Blah", revene: 3, sale: 2, fridge: "samsung" }, ]; const conditions = { // 用RegExp构造函数创建动态正则,调用test匹配字符串x 'like': (x, y) => new RegExp(y).test(x), // 如果需要不区分大小写,可添加'i'标志:new RegExp(y, 'i').test(x) }; const result = dataTofilter.filter(data => { for (const el of conditionalArray) { if (!conditions[el.condition](data[el.name], el.value)) { return false; } } return true; }); console.log(result); // 输出:[{ line: "Blah", revene: 3, sale: 2, fridge: "samsung" }]
关键修改点
- 替换
x.test(/y/)为new RegExp(y).test(x):用传入的y动态生成正则表达式,再用该正则去匹配字符串x。 - 可选:如果需要模糊匹配不区分大小写,在创建正则时添加
'i'标志,比如new RegExp(y, 'i')。
内容的提问来源于stack exchange,提问作者SteveP495
相关产品推荐
相关产品推荐

