js根据obj筛选数组(多条件数组筛选)

 Users:[
                  {
                    name: 'tom',
                    age:26,
                    email:"1@qq.com",
                    address:"河北"
                  },
                  {
                    name: 'tom',
                    age:23,
                    email:"2@qq.com",
                    address:"山东"
                  },
                  {
                    name: 'tom',
                    age:24,
                    email:"3@qq.com",
                    address:"河北"
                  },
                  {
                    name: 'mike',
                    age:25,
                    email:"4@qq.com",
                    address:"河北"
                  }
                ]
let searchObj = {
  name: "tom",
  address:"河北",
  age:24
}

我想输出一个新的数组,符合name为tom address为河北 并且age>24的符合条件的对象,应该怎么筛选?

阅读 4.8k
5 个回答
User.filter(item => item.name === 'tom' && item.address === '河北' && item.age > 24)
var Users =[
    {
      name: 'tom',
      age:26,
      email:"1@qq.com",
      address:"河北"
    },
    {
      name: 'tom',
      age:23,
      email:"2@qq.com",
      address:"山东"
    },
    {
      name: 'tom',
      age:24,
      email:"3@qq.com",
      address:"河北"
    },
    {
      name: 'mike',
      age:25,
      email:"4@qq.com",
      address:"河北"
    }
  ]
let searchObj = {
name: "tom",
address:"河北",
age:24
}


var res = Users.filter(function(it) { if(it.name== searchObj.name && it.address == searchObj.address && it.age> searchObj.age) return   it});


console.log(res)
[ { name: 'tom', age: 26, email: '1@qq.com', address: '河北' } ]
  1. function里,新建个数组
  2. 循环遍历,比较各个对象成员
  3. item.name==='tom' && item.address==='河北' && item.age > 24
  4. push到新数组里
  5. return新数组
function filter (source, keyObj) {
  let keys = Object.keys(keyObj)
  return source.filter(v => {
    return keys.every(key => v[key] === keyObj[key])
  })
}
filter(Users, searchObj)
新手上路,请多包涵
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");
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题