Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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-使用eval()作为条件-正确吗?_Javascript_Json - Fatal编程技术网

JavaScript-使用eval()作为条件-正确吗?

JavaScript-使用eval()作为条件-正确吗?,javascript,json,Javascript,Json,我有使用过滤器搜索的JSON数据: myJsonData.filter(function (entry) { return (entry.type === 'model' || entry.type === 'photographer' ); }); 现在,我没有在返回后指定这些条件,而是创建了一个类似的字符串(因为我希望有一个预先创建的搜索条件列表),然后使用eval()so: myJsonData.filter(function () { return eval(stringToSearc

我有使用
过滤器搜索的JSON数据:

myJsonData.filter(function (entry) { return (entry.type === 'model' || entry.type === 'photographer' ); });
现在,我没有在返回后指定这些条件,而是创建了一个类似的字符串(因为我希望有一个预先创建的搜索条件列表),然后使用
eval()
so:

myJsonData.filter(function () { return eval(stringToSearch) ; });
这似乎有效。然而,我只是想确认一下,这是正确的用法吗?这样做是否存在任何风险/问题

我希望能够灵活地进行任何类型的搜索,例如:

myJsonData.filter(function (entry) { 
   return (entry.type === 'model' || entry.type === 'photographer') 
          && entry.level.indexOf('advanced') > -1 ; 
});

这就是为什么我创建了一个单独的类来创建该字符串。

您可以使用输出中所需的值创建一个对象,然后进行筛选

if
条件下,我检查是否应用了高级过滤器。如果与一起应用,也检查
&
条件。如果没有,那我就检查一下正常情况

let data=[{type:'model',level:'advanced'},{type:'shopper',level:'advanced'},{type:'random',level:'random'},{type:'model',value:'without level'}]
让我们检查={'model':true,'photopher':true,advanced:['advanced']}
让输出=data.filter({type,level})=>{
如果(checks.advanced&&checks.advanced){
返回检查[类型]&检查。高级。包括(级别)
}否则{
退货支票[类型]
}
} )

console.log(output)
为了避免
eval
您可以将用户输入(通过按钮或其他方式)转换为过滤器。这些过滤器将为每个数据属性(即每个位置、类型、级别等)提供一个过滤器。其中一个过滤器可以是值列表,也可以是自由文本单个值

这里是一个示例实现,带有一个示例数据集,没有任何性感的输入/输出小部件,。。。只需简单的最小值即可演示过滤算法:

//要使用的示例数据:
风险值数据=[
{位置:“ny”,类型:“模型”,级别:“高级”,名称:“Jack”},
{地点:“ny”,类型:“模型”,级别:“初学者”,名称:“Fred”},
{地点:“sf”,类型:“模型”,级别:“经验丰富”,名称:“Helen”},
{地点:“sf”,类型:“摄影师”,级别:“高级”,名称:“Stacy”},
{地点:“sf”,类型:“摄影师”,等级:“高级经验”,名称:“Joy”},
{地点:“纽约”,类型:“摄影师”,级别:“初学者++”,姓名:“约翰”},
{地点:“sf”,类型:“模型”,级别:“无经验”,名称:“Jim”},
{地点:“纽约”,类型:“摄影师”,级别:“专业”,名称:“凯”},
];
//用于维护当前应用的过滤器的全局变量
变量筛选器={type:[],location:[],level:“};
//捕获用户选择并将其转换为筛选器
//类型1:从封闭的值列表中进行多项选择:
document.querySelector(“#seltypes”).addEventListener(“change”,function()){
filters.type=[…this.options].filter(option=>option.selected).map(option=>option.value);
刷新();
});
document.querySelector(“#sellocations”).addEventListener(“更改”,函数(){
filters.location=[…this.options].filter(option=>option.selected).map(option=>option.value);
刷新();
});
//类型2:自由文本筛选器:
document.querySelector(“#inplevel”).addEventListener(“输入”,函数(){
filters.level=this.value;
刷新();
});
函数刷新(){
//这是实际的过滤机制,使用filters变量
让结果=数据;
用于(让道具进入过滤器){
let value=过滤器[prop];
如果(!value.length)continue;//如果此筛选器为空:不筛选
结果=数组.isArray(值)
?result.filter(条目=>value.some(类型=>entry[prop]==type))
:result.filter(条目=>条目[prop]。包括(值));
}
//在输出格式上没有做任何工作:仅JSON:-)
document.querySelector(“#output”).textContent=JSON.stringify(结果,null,2);
}
//开始
刷新()
td{垂直对齐:顶部}
过滤器(按Ctrl键可多选):
类型位置级别
模型
摄影师
纽约
旧金山

使用
eval
没有什么错误。这里有三种方法可以做到这一点

当然还有其他方法可以做到这一点,但这是一种更加动态的方法

//要使用的示例数据:
风险值数据=[
{位置:“ny”,类型:“模型”,级别:“高级”,名称:“Jack”},
{地点:“ny”,类型:“模型”,级别:“初学者”,名称:“Fred”},
{地点:“sf”,类型:“模型”,级别:“经验丰富”,名称:“Helen”},
{地点:“sf”,类型:“摄影师”,级别:“高级”,名称:“Stacy”},
{地点:“sf”,类型:“摄影师”,等级:“高级经验”,名称:“Joy”},
{地点:“纽约”,类型:“摄影师”,级别:“初学者++”,姓名:“约翰”},
{地点:“sf”,类型:“模型”,级别:“无经验”,名称:“Jim”},
{地点:“纽约”,类型:“摄影师”,级别:“专业”,名称:“凯”},
];
//例1
var searchOne=函数(a){
返回a.location==“ny”;
}
//示例二:属性
var searchTwo=新函数(“a”,test.getAttribute(“条件”);
//示例三:过滤器列表,需要做很多工作。。。。处理运算符//和,或
变量三=[
{字段:“位置”,键:“=”,值:“ny”}]
console.log(“示例1”)
console.log(data.filter(searchOne))
console.log(“示例2”)
console.log(data.filter(searchTwo))
console.log(“示例3”)
console.log(data.filter)(a)=>{
var结果=真;
搜索3.forEach((x)=>{
var v=一个[x.字段];
如果(x.key==“=”)
结果=(v==x.value);
如果(x.key==“!=”),则为else
结果=(v!=x.value);
//.....
});
返回结果;
}))

不雅且可能不安全。最好找到另一种方法。你应该能够设置