javascript - 生成动态条件以过滤来自用户字符串的数据,例如 min > 0 和 max <= 100 - Javascript
问题描述
我有一种情况,最终用户将在输入字段中输入字符串,例如 "(min > 0) and (max <= 100) and (average > 10)"。我想将此字符串转换为可能的条件来过滤 API 响应。
例如,我的 API 响应将是
{
"result":{
"name1":{
"min":20,
"max":30,
"average":15
},
"name2":{
"min":20,
"max":30,
"average":15
},
"name3":{
"min":40,
"max":40,
"average":20
},
"name4":{
"name":"name4",
"min":50,
"max":50,
"average":25
}
}
}
我需要将用户输入转换为一种方式(如对象),以便我可以将其应用于响应。我尝试使用正则表达式来查找匹配项,但我做不到。请建议。
解决方案
您可以尝试以下。
- 创建一个函数,该函数接受 2 个输入响应对象和过滤器字符串
- 在函数中,更新字符串,以便所有的和都被&&替换,并且字符串中的变量像对象中的键一样被访问。请注意,此名称应与函数中用于评估表达式的名称相同
- 使用Object.entries创建一个包含 object 中所有条目的数组,然后在数组上使用Array.reduce,将数组缩减为一个对象,同时过滤数组中符合条件的项目。评估表达式使用
eval
let resp = {"result":{"name1":{"min":20,"max":30,"average":15},"name2":{"min":20,"max":30,"average":15},"name3":{"min":40,"max":40,"average":20},"name4":{"name":"name4","min":50,"max":50,"average":25}}};
let filterStr = "(min > 0) and (max <= 100) and (average > 10)";
function filterResult(obj, str) {
str = str.replace(/\(/g, "(v.").replace(/and/g, "&&");
return Object.entries(obj.result).reduce((a,[k,v]) => {
if(eval(str)) a.result[k]=v;
return a;
},{result:{}});
}
console.log(filterResult(resp, filterStr));
推荐阅读
- google-colaboratory - xgboost 是否将 TPU 用于“gpu-hist”(如果 TPU 可用)?
- javascript - 根据与对象中的多个字段进行比较的关键字返回搜索结果的最有效方法
- java - 如何检查查询过程是否在firebase中完成
- python - 为什么只有一个值写入字典?
- python-3.x - 将同一列的值合二为一
- javascript - 在内容脚本中包含一个外部库以在原始窗口上下文中使用
- ios - 苹果支付首付款返回“付款不是当前的”?还有谁有相同的问题吗?
- r - 基于字符串的分区行
- php - 履行 shopfiy api 没有响应
- javascript - 如何禁用按钮提交表单