js怎么实现多条件筛选出符合的数据(仿sql多字段查找)

clipboard.png

var conditionArr=[{
        name:'广州',
        type:'area'
    },{
        name:'一本',
        type:'batch'
    }];

    var dataArr=[{
        name:'广州大学1',
        area:'广州',
        batch:'一本'
    },{
        name:'广州大学2',
        area:'广州',
        batch:'一本'
    },{
        name:'广州大学3',
        area:'深圳',
        batch:'一本'
    },{
        name:'广州大学4',
        area:'深圳',
        batch:'二本'
    },{
        name:'广州大学5',
        area:'广州',
        batch:'二本'
    },{
        name:'广州大学6',
        area:'广州',
        batch:'二本'
    }];

    // conditionArr是筛选的条件(动态变化的),当conditionArr多一个数组时,dataArr中的每个对象就会多一个属性【此处简化属性,刚开始就有对应值】

    var temp=[];

    for(var i=0;i<dataArr.length;i++){

        for(var j=0;j<conditionArr.length;j++){

            if (dataArr[i][conditionArr[j].type] === conditionArr[j].name){

                temp.push(schoolList[i]);
            }

        }
    }

    // 当conditionArr一个数组(一个条件)时没有问题,两个以上就是叠加数据了
    console.log(temp);
阅读 8k
5 个回答
var temp=[],bool; 
for(var i=0;i<dataArr.length;i++){ 
  bool = true
  for(var j=0;j<conditionArr.length;j++){ 
    if (dataArr[i][conditionArr[j].type] !== conditionArr[j].name){ 
      bool = false; 
    } 
  } 
  bool && temp.push(dataArr[i])
} 
console.log(temp);
function deleteData(name) {
    var persons = conditionArr;
    for (var i = 0; i < persons.length; i++) {
        var cur_person = persons[i];
        if (cur_person.name== name) {
            //push
        }
    }
}
新手上路,请多包涵

也许你可以考虑underscore.js行不行

let result = dataArr.filter(data => 
    conditionArr.map(condition => data[condition['type']] === condition['name']
        .indexOf(false) === -1
)
// "[{"name":"广州大学1","area":"广州","batch":"一本"},
//   {"name":"广州大学2","area":"广州","batch":"一本"}]"

内部对条件数组进行一个映射:规则是 data[condition['type']] === condition['name']

此时如果正在遍历到

{
    name:'广州大学1',
    area:'广州',
    batch:'一本'
}

conditionArr 就变成了:

[ true, true ]

如果是

{
    name:'广州大学3',
    area:'深圳',
    batch:'一本'
}

那么 conditionArr 就变成了:

[ false, true ]

所以只需要对每一个学校进行一次条件数组的映射,如果映射结果有 false,就说明有条件不满足,反之就是满足所有条件。

根据这个再对 dataArr 进行一次过滤即可。

新手上路,请多包涵
Array.prototype._killSpaceFun = function(res){return res.replace(/\s/g,"");}

Array.prototype._whereFun = function(row,conditions){
                    var fs = [];
                    conditions.forEach(function(item,index){
                        var key = item.key;
                        var val = item.value;
                        var type = item.type;
                        var flg = false;
                        var v = row[key];
                    
                           if(typeof v != "undefined"){
                             switch(type){
                   case "==":
                   flg = (v == val);
                   break;
                   case "!=":
                   flg = (v != val);
                   break;
                   case "%%":
                   flg = (String(v).toLowerCase().indexOf(String(val)) >= 0);
                   break;
                   case "!%":
                   flg = (String(v).toLowerCase().indexOf(String(val)) < 0);
                   break;
                   case "#%":
                   flg = (String(v).substr(0,String(val).length) == String(val));
                   break;
                   case "%#":
                   flg = (String(v).substr(String(val).length,String(v).length) == String(val));
                   break;
                   case ">":
                   flg = (Number(v) > Number(val));
                   break;
                   case ">=":
                   flg = (Number(v) >= Number(val));
                   break;
                   case "<":
                   flg = (Number(v) < Number(val));
                   break;
                   case "<=":
                   flg = (Number(v) <= Number(val));
                   break;
                   default:
                   flg=false;
                   break;
                          }
                          fs.push(flg);
                           }
                        
                    });
                    return !fs.includes(false);
                }

Array.prototype._formatFun = function(cond){
                    var cc = ["%%","#%","%#","!%","==","!=",">=","<=",">","<"];
                    var cl = [];
                    var ret = null;
                    cc.forEach(function(item,index){
                       if(ret == null){
                         if(cond.indexOf(item)>=0){
                            var sm = cond.split(item);
                            ret = {"key":sm[0]};
                            ret.type = item;
                            ret.value = sm.length >= 1 ? sm[1] : null;
                            if(ret.value == null){ret=null;}
                         }
                         }
                    })
                    return ret;
                };                
                
                
                
                
Array.prototype.itemSelect = function(fields,where,igCase){
                igCase = typeof igCase == "undefined" ? true : Boolean(igCase);
                where = typeof where == "undefined" ? "" : String(where);
                where = igCase == true ? where.toLowerCase() : where;
                
                fields = this._killSpaceFun(fields);
                var flds = igCase == true ? this._killSpaceFun(fields).toLowerCase().split(",") : this._killSpaceFun(fields).split(",");
                
                var src_conds = this._killSpaceFun(where).split("&&");
                var obj_conds = [];
                src_conds.forEach(function(item,index){
                     var cond = obj_conds._formatFun(item);
                     if(cond!=null){
                        obj_conds.push(cond);
                     }
                });
                
            
                var _ls = [];
                this.forEach(function(item,index){
                     if(obj_conds._whereFun(item,obj_conds)){
                        if(fields == "*" || fields == ""){
                          _ls.push(item);
                        }else{
                        var _row = {};
                        flds.forEach(function(key,idx){
                           _row[key] = typeof item[key] == "undefined" ? null : item[key];
               
                          });
                       _ls.push(_row);
                       }
                     }
                });
                return _ls;
                
}

试下这个,无聊的时候测试的产物。
使用如下

var list = [{id:1,"name":"a"},{id:2,"name":"aa"},{id:3,"name":"bbb"}];
//查询基本语法,array.itemSelect("字段列表","条件")
//==:等于
//>=:大于等于
//<=:小于等于
//%%:%A%
//#%:A%
//%#:%A
//!=:不等于
//>:大于
//<:小于

list.itemSelect("id,name","id > 1");
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题