首页 > 解决方案 > 生成动态条件以过滤来自用户字符串的数据,例如 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
      }
   }
}

我需要将用户输入转换为一种方式(如对象),以便我可以将其应用于响应。我尝试使用正则表达式来查找匹配项,但我做不到。请建议。

标签: javascript

解决方案


您可以尝试以下。

  • 创建一个函数,该函数接受 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));


推荐阅读