深入数组方法与应用,筛选条件

算是一个dome功能,实现之后的样式是这样的

在这里插入图片描述
类似于选项卡,当点击all展示所有的卡片
在这里插入图片描述
当点击Female的时候会展示所有男性的卡片在这里插入图片描述
反之点击女性也是一样的
并且还有条件筛选,当点击输入九的时候会展示所有字符当中含有九的男性在这里插入图片描述
该dome运动的一些方法有:

forEach,数组遍历方法

Filter,数组筛选方法

for in 循环,遍历对象方法

indexOf,判断当前值是包含有里面的值

getAttribute 读取元素属性的值

JS设计模式思想(人懵的)

以下是初级代码实现该功能

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding: 0;
            margin: 0;
            list-style: none;
        }
        .wrapper{
            width: 400px;
            padding: 10px 15px;
            border: 1px solid #ccc;
            margin: 100px auto 0px;
            border-radius: 6px;
        }
        .wrapper .sWrapper{
            margin-bottom: 20px;
        }
        .wrapper .sWrapper .sText{
            width: 220px;
            height: 25px;
            padding-left: 10px;
            outline: none;
            border-radius: 4px;
            border: 1px solid #777;
            
        }
        .wrapper .sWrapper .btn{
            cursor: pointer;
            color: #3c8dff;
            padding:  0px 5px;
        }
        .wrapper .sWrapper .btn.active{
            color: #fff;
            background-color: #3c8dff;
            border-radius:5px;
        }
        .wrapper .flWrapper ul li{
            border-bottom: 1px solid #999;
            position: relative;
            padding-left: 45px;
            padding-top: 10px;
            padding-bottom: 5px;
        }
        .wrapper .flWrapper ul li img{
            position: absolute;
            width:36px;
            height:36px;
            left: 0;
            top: 14px;
        }
     

        .wrapper .flWrapper ul li .des{
            font-size: 12px;
            color: #666;
            margin-top: 5px;
        }
        
    </style>
</head>
<body>
    <div class="wrapper">
        <div class="sWrapper">
            <input type="text" class="sText">
            <span sex='m' class="btn">Male</span>
            <span sex='f' class="btn">Female</span>
            <span sex='a' class="btn active">All</span>
        </div>
        <div class="flWrapper">
            <ul></ul>
        </div>
    </div>

        var personArr = [
            {'name' : "九依", 'src' : "./img/1.jpg", 'sex' : 'f', 'age' : '19', 'des' : "太高了"},
            {'name' : "夕灿", 'src' : "./img/2.jpg", 'sex' : 'm', 'age' : '19', 'des' : "啊哈哈哈"},
            {'name' : "夕阳灿", 'src' : "./img/3.jpg", 'sex' : 'm', 'age' : '19', 'des' : "今天还没吃饭"},
            {'name' : "小宁", 'src' : "./img/4.jpg", 'sex' : 'f', 'age' : '19', 'des' : "我叫什么"},
            {'name' : "九测", 'src' : "./img/5.jpg", 'sex' : 'f', 'age' : '19', 'des' : "办法没办法"},
        ];
        // 
        
        var oUl = document.getElementsByTagName('ul')[0];   
        var oInput = document.getElementsByTagName('input')[0];
        //记录当前输入的文本
        var filterText = '';
        //记录性别
        var filterSex = 'a';
        function RenderPage (data){
            // 遍历 
            var htmlStr = ' ';
            oUl.innerHTML = ' ';
            data.forEach(function (ele ,index ,self) {
                //字符串拼接代码
               htmlStr = htmlStr + '<li><img src = "' + ele.src + '"></img><p class = "name">' + ele.name+ '</p><p class = "des">' + ele.des + '</p></li>'
            })
            oUl.innerHTML = htmlStr;
        }
        RenderPage(personArr)   

        //添加行为
        oInput.oninput = function(data) {
            //当输入框输入的时候不断触发
            //不断去记录当前输入的值
            filterText = this.value;
            //执行渲染   文本过滤方法    //数组   输入的值进行渲染
            //1. RenderPage(filterArrByText(personArr,this.value))
            //将符合条件的数组存入   过滤文本方法   原始数组     输入的值
            var newArr = filterArrByText(    personArr,  filterText)
            //将符合条件的数组存入  过滤性别的方法  之后的数组  输入的值
            var newArr2 = filterArrBySex(      newArr, filterSex);
            //执行符合之后的数组
            RenderPage(newArr2)

        }
        //根据文本进行过滤的函数 纯函数
        //                  传入的数组   输入的值
        function filterArrByText (data, text){
            if (!text){
                //如果没有值或者是空直接返回数组
                return data;
            }else{
                //  返回一个过滤后的数组    //数组  //位置
               return data.filter(function (ele, index){
                    //    判断数组的Name是否符合条件判断 
                   return ele.name.indexOf(text) != -1;
                })
            }
        }

        //按钮切换的颜色
        //获取当前按钮的所有数组
                     //获取的是一个类数组,需要用数组的slice方法来让他变为数组
        var oBtnArr = [].slice.call(document.getElementsByClassName('btn'), 0);
        //记忆初始按钮的位置
        var lastActiveBtn = oBtnArr[2];
        //遍历数组按钮            数组  位置   数组列
        oBtnArr.forEach(function(ele, index, self){
            //当点击的时候触发事件
            ele.onclick = function(){
         //用更改样式的函数    传入当前点击的按钮
                changeActive(this);
                filterSex = this.getAttribute('sex')
                // getAttribute读出当前按钮属性的值
               //1. RenderPage(filterArrBySex(personArr, this.getAttribute('sex')));
            //将符合条件的数组存入   性别过滤方法   原始数组     输入的值
               var newArr = filterArrBySex(personArr, filterSex)
            //将符合条件的数组存入   过滤文本方法   之后数组     输入的值
               var newArr2 = filterArrByText(newArr, filterText);
               //执行符合之后的数组
               RenderPage(newArr2);
            }
            
        })
        //更改样式的函数方法      //点击的按钮
        function changeActive (curActiveBtn){
             //如果当前点击的按钮是重复样式值就空执行
            if(curActiveBtn.className == 'btn active'){
            }else{
                //否则就执行
                 curActiveBtn.className = 'btn active';
                 //让初始的样式变为无样式
                 lastActiveBtn.className = 'btn';
                 //记忆上一个点击的按钮位置
                 lastActiveBtn = curActiveBtn;
            }
          
        }

        //根据性别过滤的函数方法  //数组  点击的性别
        function filterArrBySex(data, sex){
            //如果性别等于all
            if ( sex == 'a'){
                //直接返回当前的数组
                return data;
            }else{
                //过滤 数组的筛选方法     数组索引每一列   数组索引  数组
                return data.filter(function (ele, index, self){
                    //返回当前点击的性别
                    return ele.sex == sex;
                })
            }
        }

迭代优化,高级模式

优点化
条件增加导致行为增加该如何统一处理
诸多状态如何管理
行为频繁触发操作dom如何提高性能

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding: 0;
            margin: 0;
            list-style: none;
        }
        .wrapper{
            width: 400px;
            padding: 10px 15px;
            border: 1px solid #ccc;
            margin: 100px auto 0px;
            border-radius: 6px;
        }
        .wrapper .sWrapper{
            margin-bottom: 20px;
        }
        .wrapper .sWrapper .sText{
            width: 220px;
            height: 25px;
            padding-left: 10px;
            outline: none;
            border-radius: 4px;
            border: 1px solid #777;
        }
        .wrapper .sWrapper .btn{
            cursor: pointer;
            color: #3c8dff;
            padding:  0px 5px;
        }
        .wrapper .sWrapper .btn.active{
            color: #fff;
            background-color: #3c8dff;
            border-radius:5px;
        }
        .wrapper .flWrapper ul li{
            border-bottom: 1px solid #999;
            position: relative;
            padding-left: 45px;
            padding-top: 10px;
            padding-bottom: 5px;
        }
        .wrapper .flWrapper ul li img{
            position: absolute;
            width:36px;
            height:36px;
            left: 0;
            top: 14px;
        }
     

        .wrapper .flWrapper ul li .des{
            font-size: 12px;
            color: #666;
            margin-top: 5px;
        }
        
    </style>
</head>
<body>
    <div class="wrapper">
        <div class="sWrapper">
            <input type="text" class="sText">
            <span sex='m' class="btn">Male</span>
            <span sex='f' class="btn">Female</span>
            <span sex='a' class="btn active">All</span>
        </div>
        <div class="flWrapper">
            <ul></ul>
        </div>
    </div>
    <script src="./js/tool.js"></script>
    <script src="./js/filter/filterArrBySex.js"></script>
    <script src="./js/filter/filterArrByText.js"></script>
    <script src="./js/combineFilter.js"></script>
    <script src="./js/createStore.js"></script>
    <script src="./js/index.js"></script>
</body>
</html>
     var personArr = [
    {'name' : "九依", 'src' : "./img/1.jpg", 'sex' : 'f', 'age' : '19', 'des' : "太高了"},
    {'name' : "夕灿", 'src' : "./img/2.jpg", 'sex' : 'm', 'age' : '19', 'des' : "啊哈哈哈"},
    {'name' : "夕阳灿", 'src' : "./img/3.jpg", 'sex' : 'm', 'age' : '19', 'des' : "今天还没吃饭"},
    {'name' : "小宁", 'src' : "./img/4.jpg", 'sex' : 'f', 'age' : '19', 'des' : "我叫什么"},
    {'name' : "九测", 'src' : "./img/5.jpg", 'sex' : 'f', 'age' : '19', 'des' : "办法没办法"},
];
 

var oUl = document.getElementsByTagName('ul')[0];   
var oInput = document.getElementsByTagName('input')[0];
store.subscribe(function (){
    //更新页面和视图的作用

    //调用整合方法工具
    RenderPage(lsatFilterArr(personArr));
})

function RenderPage (data){
    var htmlStr = ' ';
    oUl.innerHTML = ' ';
    data.forEach(function (ele ,index ,self) {
       htmlStr = htmlStr + '<li><img src = "' + ele.src + '"></img><p class = "name">' + ele.name+ '</p><p class = "des">' + ele.des + '</p></li>'
    })
    oUl.innerHTML = htmlStr;
}
RenderPage(personArr)  
                  //防抖 
oInput.oninput = debounce(function(data) {
    //调用store的订阅方法       文本      当前文本框的值
    store.dispatch({type : 'text', value : this.value },50)
   
})

var oBtnArr = [].slice.call(document.getElementsByClassName('btn'), 0);
var lastActiveBtn = oBtnArr[2];
oBtnArr.forEach(function(ele, index, self){
    ele.onclick = function(){
        changeActive(this);
  //调用store的订阅方法        性别筛选                     读按钮属性的值
        store.dispatch({type : 'sex', value : this.getAttribute('sex') })
        
    
     
    }
})
function changeActive (curActiveBtn){
    if(curActiveBtn.className == 'btn active'){
    }else{
         curActiveBtn.className = 'btn active';
         lastActiveBtn.className = 'btn';
         lastActiveBtn = curActiveBtn;
    }
  
}

在此基础上引入了一个工具集合包


//封装一个工具库          传入的两个方法
function combineFilter(config){
    //返回一个函数     数组    
    return function (data){
        //遍历对象                    遍历每个方法
                    for (var prop in config){
        //  console.log(prop, config[prop], state[prop])
    //data等于筛选完之后的数组      第一个方法  数组    筛选条件
        data = config[prop](data,store.getState(prop))
     }
     //返回数组
     return data;
    }
}
//lastFilterArr相当于对象合集,他等于执行一个对象之后的结果
var lsatFilterArr = combineFilter({
    text : filterArrByText,
    sex : filterArrBySex
})

引入方法功能 filterArrByText

function filterArrByText (data, text){
    if (!text){
        return data;
    }else{
       return data.filter(function (ele, index){
           return ele.name.indexOf(text) != -1;
        })
    }
}

引入方法功能 filterArrBySex

function filterArrBySex(data, sex){
    if ( sex == 'a'){
        return data;
    }else{
        return data.filter(function (ele, index, self){
            return ele.sex == sex;
        })
    }
}

封装接口 combineFilter

//封装一个工具库          传入的两个方法
function combineFilter(config){
    //返回一个函数     数组    
    return function (data){
        //遍历对象                    遍历每个方法
                    for (var prop in config){
        //  console.log(prop, config[prop], state[prop])
    //data等于筛选完之后的数组      第一个方法  数组    筛选条件
        data = config[prop](data,store.getState(prop))
     }
     //返回数组
     return data;
    }
}
//lastFilterArr相当于对象合集,他等于执行一个对象之后的结果
var lsatFilterArr = combineFilter({
    text : filterArrByText,
    sex : filterArrBySex
})

笔记自渡一教育,哎人给我看傻了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值