/** * 条件解析 * cond : 用户设置条件 * condList : 条件列表 */analyseCond = (cond, condList) => { // 未设置条件,默认通过 var condMap = { cond, // 用户设置条件 analyseCond: "true", // 解析后条件 eleList : [] // 条件变量列表 }; if(cond && cond.trim()!==""){ var condEleList = []; // cond 解析并排序(倒排序) cond.match(/#\d+/g).forEach(item =>{ var no = item.match(/\d+/)[0]; condEleList.push(parseInt(no)); }) // 倒排序 condEleList.sort((a,b)=>b>a); console.log(condEleList); // 解析自定义条件 var analyseCond = cond; var eleList = []; var operList = []; var valList = []; var detailList = []; condEleList.forEach(no => { var condInfo = condList[no-1]; if(condInfo){ const {cond, oper, value} = condInfo; if(!eleList.includes(cond)){ eleList.push(cond); operList.push(oper); valList.push(value); detailList.push({cond, oper, value}); } console.log(cond, oper, value); var newCond = ""; if([">", "<", ">=", "<=", "==", "!="].includes(oper)){ newCond = `${cond} ${oper} ${value}`; }else if(["in"].includes(oper)){ newCond = JSON.stringify(value.split(/[,;,; ]/))+`.includes(""+${cond})`; }else if(["notin"].includes(oper)){ newCond = "!"+JSON.stringify(value.split(/[,;,; ]/))+`.includes(""+${cond})`; }else{ console.log(`不支持的操作类型【${oper}】`); } console.log(newCond) analyseCond = analyseCond.replace(new RegExp(`#${no}`, "g"), newCond); }else{ // 不存在的条件序号,默认都为true analyseCond = analyseCond.replace(new RegExp(`#${no}`, "g"), "true"); } }) condMap.analyseCond = analyseCond; condMap.eleList = eleList; condMap.operList = operList; condMap.valList = valList; condMap.detailList = detailList; console.log(condMap); } return condMap;}/** * 数据集过滤 * dataset : 数据集 * condMap : 自定义条件信息,通过analyseCond(cond, condList)解析后的条件信息 */filterByCond=(dataset, condMap)=>{ var filteredList = []; const {analyseCond, eleList} = condMap; dataset.forEach(data=>{ var varStr = ""; eleList.forEach(quota=>{ varStr += "var "; varStr += quota ; varStr += " = " ; varStr += data[quota]; varStr += ";\n"; }) console.log(varStr, analyseCond); var visable = eval(varStr + analyseCond); if(visable){ filteredList.push(data); } }) return filteredList;}// 测试条件列表var condList = [ {cond:"quota1", oper:">", value:"10"}, {cond:"quota2", oper:"==", value:"2"}, {cond:"quota3", oper:"notin", value:"3,5"}, {cond:"quota4", oper:">=", value:"8"}, {cond:"quota5", oper:">=", value:"8"}, {cond:"quota6", oper:">=", value:"8"}, {cond:"quota7", oper:">=", value:"8"}, {cond:"quota8", oper:">=", value:"8"}, {cond:"quota9", oper:">=", value:"8"}, {cond:"quota10", oper:">=", value:"8"}, {cond:"quota11", oper:">=", value:"8"}, {cond:"quota12", oper:">=", value:"8"}, {cond:"quota13", oper:">=", value:"8"}, {cond:"quota14", oper:"in", value:"1"},];// 测试用户设置条件var cond = "(#1 || #2) && #3 && (#4 || #14 ) && #15";// 自定义条件解析var condMap = analyseCond(cond, condList);// 测试数据var testDataList = [{quota1: 1, quota2: 2, quota3: 4, quota4:7},{quota1: 1, quota2: 2, quota3: 3, quota4:9},{quota1: 1, quota2: 3, quota3: 4, quota4:4},{quota1: 11, quota2: 3, quota3: 4, quota4:9},]// 测试数据过滤var filteredDataset = filterByCond(testDataList, condMap);console.log(filteredDataset);