You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中使用new Function配合_.filter筛选数组报未定义错误如何解决

用new Function结合underscore的filter筛选对象数组的报错解决

你的代码存在3个核心错误:

  • new Function用法不符合规范:filter的回调会接收当前遍历的数组元素作为入参,你没有声明函数入参,函数体内直接访问id、size等属性时会被识别为全局变量而非当前元素的属性,自然会报未定义错误。
  • 条件表达式写法错误:字符串值large没有加引号,会被识别为变量而非字符串常量;逻辑并列的条件不能用逗号分隔,要换成逻辑与运算符&&;你写在字符串里的>是HTML转义字符,不会被自动解析为大于号>。
  • 调用_.filter时第一个参数传入了未定义的data,应该传入你要筛选的源数组inventory。

修正方案

  1. 先修正条件规则的写法:
    把原criteria替换为:
    let criteria = "size=='large' && id>2";
  2. 正确构造过滤函数,声明入参并返回判断结果:
    new Function('item', return ${criteria})
  3. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:15:03