Node.js中使用new Function配合_.filter筛选数组报未定义错误如何解决
用new Function结合underscore的filter筛选对象数组的报错解决
你的代码存在3个核心错误:
new Function用法不符合规范:filter的回调会接收当前遍历的数组元素作为入参,你没有声明函数入参,函数体内直接访问id、size等属性时会被识别为全局变量而非当前元素的属性,自然会报未定义错误。- 条件表达式写法错误:字符串值
large没有加引号,会被识别为变量而非字符串常量;逻辑并列的条件不能用逗号分隔,要换成逻辑与运算符&&;你写在字符串里的>是HTML转义字符,不会被自动解析为大于号>。 - 调用
_.filter时第一个参数传入了未定义的data,应该传入你要筛选的源数组inventory。
修正方案
- 先修正条件规则的写法:
把原criteria替换为:let criteria = "size=='large' && id>2"; - 正确构造过滤函数,声明入参并返回判断结果:
new Function('item',return ${criteria}) - 修正filter调用的参数。
完整可运行代码
let _ = require('underscore'); let inventory = [ {'id':1, 'color':'red', 'size':'large'}, {'id':2, 'color':'orange', 'size':'small'}, {'id':3, 'color':'orange', 'size':'large'}, {'id':4, 'color':'red', 'size':'small'}, {'id':1, 'color':'orange', 'size':'small'} ]; let criteria = "size=='large' && id>2"; // 构造正确的过滤函数 let filterFunc = new Function('item', `return ${criteria}`); let data = _.filter(inventory, filterFunc); console.log(data);
运行后输出结果为[ { id: 3, color: 'orange', size: 'large' } ],符合你的预期。
注意事项
如果你的criteria来自用户输入,使用new Function存在代码注入风险,仅在输入完全可控的场景下使用该方案。
内容的提问来源于stack exchange,提问作者jlsym
相关产品推荐
相关产品推荐

