Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON数组筛选器操作期间出错_Javascript_Node.js_Typescript - Fatal编程技术网

Javascript JSON数组筛选器操作期间出错

Javascript JSON数组筛选器操作期间出错,javascript,node.js,typescript,Javascript,Node.js,Typescript,这件事真让我头疼:我正在根据每个数组元素的一个或多个属性过滤JSON对象数组。由于筛选器表达式每次迭代都会更改,因此我使用vm.runInNewContext()(而不是可怕的eval())来计算不断更改的筛选器表达式字符串,如下所示: filteredArray = originalArray.filter( vm.runInNewContext("(row) => {return " + filterExpression + "}")); 我已经验证(通过console.log

这件事真让我头疼:我正在根据每个数组元素的一个或多个属性过滤JSON对象数组。由于筛选器表达式每次迭代都会更改,因此我使用
vm.runInNewContext()
(而不是可怕的
eval()
)来计算不断更改的筛选器表达式字符串,如下所示:

filteredArray = originalArray.filter(
   vm.runInNewContext("(row) => {return " + filterExpression + "}"));
我已经验证(通过
console.log(JSON.stringify(filteredArray))
)这确实实现了所需的过滤

现在是疯狂的部分:我试图在下面立即添加一些代码,以删除
filteredArray
中每个元素的某些属性,如下所示:

filteredArray.forEach((row) => { delete row.Attribute });
同样,这很好,进一步向下过滤
FilterDarray
,除非
行.Attribute
是我在第一个代码块中过滤的字符串属性,并且之前的过滤包括字符串运算符
.includes()
.startsWith()
.endsWith()
。在这些情况下,原始筛选(第一个代码块)失败,抛出错误无法读取未定义的属性“includes”(或'startsWith''endsWith',具体取决于
filterExpression
中的内容)

换言之,第二个代码块中发生的某些事情以某种方式“回溯”并导致第一个代码块失败(如果第二个代码块不存在,则会成功)


有人见过这样的东西吗?

可能是
vm.runInNewContext
的工作方式有些奇怪。你能不能不使用
过滤器表达式
,而是将整个过滤器函数作为变量?这里有一把小提琴来解释我的意思。谢谢,我曾经想过做那样的事。唯一的挑战是有9个可能的筛选条件,在一个给定的操作中,我可以有1到全部9个条件,再加上&&或| |,因此有大量潜在的预编码组合。然而,从效率的角度来看,这让我非常痛苦,我想我可以通过依次重新过滤结果,一次一个过滤标准来分解任何组合。(我想你已经了解了关于
vm.runInNewContext
——一些非常神奇的东西。)