• 【干货】原生js做的一维数组对象,二维数组对象的模糊查询(前端网备份)


    最重要的是二维数组

    小程序通讯录(student)

    后台的数据格式

    wxml
    <input bindconfirm="search" bindinput="bindinput" confirm-type="搜索" class="wxSearch-input" placeholder="姓名" />
    js

    正式版顺序搜索算法
    先来说几个坑:
    1>比如 var field = "user";
    item.field 就会报错,写法只能为item[field]
    2>比如type为number的时候,管理员没有这个number字段,所以
    item[field][i][type[j]].indexOf(value)就会报错,所以要再上面判断一层,underfind的时候把他绕过去,增加一条
    if (item[field][i][type[j]] != undefined || item[field][i][type[j]] != null)

    /*二维数组对象模糊搜索
      dataList 为二维数组数据结构
      value 为input框的输入值
      type 为指定想要搜索的字段名,array格式 ["name", "number"];
      field 为二维数组的字段 比如二维数组字段名为user
     */
    function filterData(dataList, value, type, field) {
      var s = dataList.filter(function(item, index, arr) {
        for (let i = 0; i < item[field].length; i++) {
          for (let j = 0; j < type.length; j++) {
            console.log(item[field][i][type[j]]);
            if (item[field][i][type[j]] != undefined || item[field][i][type[j]] != null) {
              if (item[field][i][type[j]].indexOf(value) >= 0) {
                var arr2 = [];
                var s = item[field].filter(function(items, indexs, arrs) {
                  if (items[type[j]].indexOf(value) >= 0) {
                    arr2.push(items);
                    return arr2;
                  }
                })
                item.user = s;
                return item;
              }
            }
    
          }
        }
      });
      return s;
    }

    第一版有点缺陷的算法

      bindinput: function (options) {
        var value = options.detail.value;
        value = value.replace(/^s+|s+$/g, "");
          this.setData({
            value: value
          })
      },
     search(e) {
        var value = this.data.value;
        var type = ["name","number"];
        if (value == "") {
          console.log("我是空");
          this.getData(this.data.id, this.data.type, "");
        }
        var li = this.filter(this.data.group, value, type);
    //这里为搜索不到值得时候返回得空数组,就让他重新查一次
        console.log(li);
        if (li.length == 0) {
          this.getData(this.data.id, type, "");
        } else {
          this.setData({
            group: li
          })
        }
      },
    //重头戏来了
    /*dataList为上图图片得后台数据结构;
      value为input输入值;
      type为想查询得类型,比如name,number字段*/
      filter: function (dataList, value, type) {
        var s = dataList.filter(function (item, index, arr) {
            //item返回得是一维数组结构
            //下面遍历二维user数组对象
            for (let i = 0; i < item.user.length; i++) {
              //遍历type数组对象,判断下来要筛选的字段
              for (let j = 0; j < type.length; j++){
                //判断二维数组里面得name或者number得值里面包含value不;如果不包含返回-1就不继续执行
                if (item.user[i][type[j]].indexOf(value) >= 0) {
                  var arr2 = [];
                  //items返回得是二维数组结构得字段
                  var s = item.user.filter(function (items, indexs, arrs) {
                    //判断二维数组里面得name或者number得值里面包含value不;如果不包含返回-1就不继续执行
                    //然后把二位里面得多个对象结果都存到新数组arr2去
                    //然后返回二维得s过滤器
                    if (items[type[j]].indexOf(value) >= 0) {
                      arr2.push(items);
                      return arr2;
                    }
                  })
                  //这里得s得值为arr2,因为item为一维过滤器,实际在遍历种
                  //所以item.user可以返回当前所对应得那一条数组,改变里面得二维值,为需要的
                  item.user = s;
                  //返回item,为过滤器筛选好了的给上一层s
                  return item;
                }
              }
            }
        });
        //返回到search里面得li去接收
        return s;
      },

    遇到的深坑

    下图原因是因为没有加

    if (items[type[j]].indexOf(value) >= 0) {}

    下图原因是因为没有加

    if (item.user[i][type[j]].indexOf(value) >= 0) {}

    一维数组:

    正式版一位数组:

    var type = ["name", "id"];
        var dataList = [
          { name: "蓝有",number: "1" },
          { name: "蓝天", number: "2" },
          { name: "李天一", number: "3" },
          { name: "懒", number: "4" },
        ]
        var value = "天";
    
    /*一维数组对象模糊搜索
      dataList 为一维数组数据结构
      value 为input框的输入值
      type 为指定想要搜索的字段名,array格式 ["name", "number"];
     */
    function filterOne(dataList, value, type) {
      var s = dataList.filter(function(item, index, arr) {
        console.log(item)
        for (let j = 0; j < type.length; j++) {
          if (item[type[j]] != undefined || item[type[j]] != null) {
            if (item[type[j]].indexOf(value) >= 0) {
              return item;
            }
          }
        }
      });
      return s;
    }
    var list = ["蓝有","蓝天",'李天一',"懒"];
            var list = [
                {name:"蓝有",id:1},
                {name:"蓝天",id:2},
                {name:"李天一",id:3},
                {name:"懒",id:4},
            ]
            var len = list.length;
            var arr = [];
            for(var i=0;i<len;i++){
                //如果字符串中不包含目标字符会返回-1
                if(list[i].name.indexOf("天")>=0){
                    console.log(list[i]);//{name: "蓝天", id: 2}   
              //{name: "李天一", id: 3}
                    arr.push(list[i]);
                }
            }
            console.log(arr) ;
                //[0: {name: "蓝天", id: 2}
                //1: {name: "李天一", id: 3}]
  • 相关阅读:
    8.17 纯css画一个着重号图标
    8.16 val()和html()的问题
    8.14 git??sourceTree??
    7.27-8.10 Problems
    To be a better me
    【LeetCode刷题】Set and bitset
    【LeetCode刷题】求平方根
    【LeetCode刷题】爬楼梯问题
    大学四年就这样,么了~
    硬件综合实习——51单片机四则运算带括号计算器
  • 原文地址:https://www.cnblogs.com/lsc-boke/p/10997160.html
Copyright © 2020-2023  润新知