1. /**
    2. * 条件解析
    3. * cond : 用户设置条件
    4. * condList : 条件列表
    5. */
    6. analyseCond = (cond, condList) => {
    7. // 未设置条件,默认通过
    8. var condMap = {
    9. cond, // 用户设置条件
    10. analyseCond: "true", // 解析后条件
    11. eleList : [] // 条件变量列表
    12. };
    13. if(cond && cond.trim()!==""){
    14. var condEleList = [];
    15. // cond 解析并排序(倒排序)
    16. cond.match(/#\d+/g).forEach(item =>{
    17. var no = item.match(/\d+/)[0];
    18. condEleList.push(parseInt(no));
    19. })
    20. // 倒排序
    21. condEleList.sort((a,b)=>b>a);
    22. console.log(condEleList);
    23. // 解析自定义条件
    24. var analyseCond = cond;
    25. var eleList = [];
    26. var operList = [];
    27. var valList = [];
    28. var detailList = [];
    29. condEleList.forEach(no => {
    30. var condInfo = condList[no-1];
    31. if(condInfo){
    32. const {cond, oper, value} = condInfo;
    33. if(!eleList.includes(cond)){
    34. eleList.push(cond);
    35. operList.push(oper);
    36. valList.push(value);
    37. detailList.push({cond, oper, value});
    38. }
    39. console.log(cond, oper, value);
    40. var newCond = "";
    41. if([">", "<", ">=", "<=", "==", "!="].includes(oper)){
    42. newCond = `${cond} ${oper} ${value}`;
    43. }else if(["in"].includes(oper)){
    44. newCond = JSON.stringify(value.split(/[,;,; ]/))+`.includes(""+${cond})`;
    45. }else if(["notin"].includes(oper)){
    46. newCond = "!"+JSON.stringify(value.split(/[,;,; ]/))+`.includes(""+${cond})`;
    47. }else{
    48. console.log(`不支持的操作类型【${oper}】`);
    49. }
    50. console.log(newCond)
    51. analyseCond = analyseCond.replace(new RegExp(`#${no}`, "g"), newCond);
    52. }else{
    53. // 不存在的条件序号,默认都为true
    54. analyseCond = analyseCond.replace(new RegExp(`#${no}`, "g"), "true");
    55. }
    56. })
    57. condMap.analyseCond = analyseCond;
    58. condMap.eleList = eleList;
    59. condMap.operList = operList;
    60. condMap.valList = valList;
    61. condMap.detailList = detailList;
    62. console.log(condMap);
    63. }
    64. return condMap;
    65. }
    66. /**
    67. * 数据集过滤
    68. * dataset : 数据集
    69. * condMap : 自定义条件信息,通过analyseCond(cond, condList)解析后的条件信息
    70. */
    71. filterByCond=(dataset, condMap)=>{
    72. var filteredList = [];
    73. const {analyseCond, eleList} = condMap;
    74. dataset.forEach(data=>{
    75. var varStr = "";
    76. eleList.forEach(quota=>{
    77. varStr += "var ";
    78. varStr += quota ;
    79. varStr += " = " ;
    80. varStr += data[quota];
    81. varStr += ";\n";
    82. })
    83. console.log(varStr, analyseCond);
    84. var visable = eval(varStr + analyseCond);
    85. if(visable){
    86. filteredList.push(data);
    87. }
    88. })
    89. return filteredList;
    90. }
    91. // 测试条件列表
    92. var condList = [
    93. {cond:"quota1", oper:">", value:"10"},
    94. {cond:"quota2", oper:"==", value:"2"},
    95. {cond:"quota3", oper:"notin", value:"3,5"},
    96. {cond:"quota4", oper:">=", value:"8"},
    97. {cond:"quota5", oper:">=", value:"8"},
    98. {cond:"quota6", oper:">=", value:"8"},
    99. {cond:"quota7", oper:">=", value:"8"},
    100. {cond:"quota8", oper:">=", value:"8"},
    101. {cond:"quota9", oper:">=", value:"8"},
    102. {cond:"quota10", oper:">=", value:"8"},
    103. {cond:"quota11", oper:">=", value:"8"},
    104. {cond:"quota12", oper:">=", value:"8"},
    105. {cond:"quota13", oper:">=", value:"8"},
    106. {cond:"quota14", oper:"in", value:"1"},
    107. ];
    108. // 测试用户设置条件
    109. var cond = "(#1 || #2) && #3 && (#4 || #14 ) && #15";
    110. // 自定义条件解析
    111. var condMap = analyseCond(cond, condList);
    112. // 测试数据
    113. var testDataList = [
    114. {quota1: 1, quota2: 2, quota3: 4, quota4:7},
    115. {quota1: 1, quota2: 2, quota3: 3, quota4:9},
    116. {quota1: 1, quota2: 3, quota3: 4, quota4:4},
    117. {quota1: 11, quota2: 3, quota3: 4, quota4:9},
    118. ]
    119. // 测试数据过滤
    120. var filteredDataset = filterByCond(testDataList, condMap);
    121. console.log(filteredDataset);