用户列表组合条件查找与筛选(原生javascript编写)

时间:2024-10-09 06:56:48

效果:可通过按钮和输入文字进行组合条件筛选

这里使用数组模拟后台数据(可用ajax请求后台数据):

  1. var person = [
  2. { name: '王小妹', src: '', sex: 'male', des: '漂亮的妹子'},
  3. { name: '金小妹', src: '', sex: 'male', des: '漂亮的程序媛'},
  4. { name: '陈小华', src: '', sex: 'female', des: '相互学习'},
  5. { name: '马爱国', src: '', sex: 'female', des: '喜欢猫'},
  6. { name: '邓小茜', src: '', sex: 'male', des: '喜欢运动'},
  7. { name: '马学习', src: '', sex: 'female', des: '喜欢看书'}
  8. ]
'
运行

主要html结构:

  1. <body>
  2. <div class="wrapper">
  3. <div class="search">
  4. <input type="text" placeholder="请输入用户名" id="input">
  5. <ul id="searchUl">
  6. <li class="active" sex = "all">All</li>
  7. <li sex = "male">Male</li>
  8. <li sex = "female">Female</li>
  9. </ul>
  10. </div>
  11. <div class="userList">
  12. <ul id="list">
  13. <!-- 方便确定插入数据的结构和样式 -->
  14. <!-- <li><img src="./images/" alt="">
  15. <span class="name">小航</span>
  16. <span class="des">描述</span>
  17. </li> -->
  18. </ul>
  19. </div>
  20. </div>
  21. <script src="./"></script>
  22. </body>

思路及js核心代码:

1)渲染dom结构:使用forEach()方法遍历数组,找出符合条件的数据,有几条数据就生成几个li结构代码块,然后把生成的li结构插入ul中去;

  1. var listUl = document.getElementById('list');
  2. var oInp = document.getElementById('input');
  3. var sUl = document.getElementById('searchUl');
  4. //渲染dom结构,遍历数组使用forEach()方法
  5. function render(list){
  6. var str = '';
  7. list.forEach(function(ele, index){
  8. str += '<li><img src="./images/'+ ele.src +'" alt="">\
  9. <span class="name">'+ ele.name +'</span>\
  10. <span class="des">'+ ele.des +'</span></li>';
  11. });
  12. listUl.innerHTML = str;
  13. }

2)单一输入框文字筛选:获取input输入框输入的值,绑定一个oninput事件,使用使用数组过滤筛选方法filter()进行文本过滤;

  1. //获取input输入的value值,需绑定一个oninput事件,获取过滤结果后渲染
  2. oInp.oninput = function(){
  3. var text = this.value;
  4. // = ; //组合条件筛选
  5. render(filterText(text, person)); //单一筛选、渲染
  6. //render(addFn(filterFn,person)); //组合条件筛选、渲染
  7. }
  8. //输入文本过滤
  9. function filterText(val, arr){
  10. var fArr = arr.filter(function(ele, index){
  11. if(ele.name.indexOf(val) !== -1){
  12. return true;
  13. }
  14. })
  15. return fArr;
  16. }

3)单一点击按钮筛选:点击事件绑定在ul上,由li触发

  1. //绑定点击事件
  2. sUl.addEventListener('click', function(e){
  3. if(e.target.tagName == 'LI'){
  4. var sex = e.target.getAttribute('sex');
  5. // = ('sex'); //组合条件筛选
  6. document.getElementsByClassName('active')[0].className = ''; //修改点击按钮的样式
  7. e.target.className = 'active'; //修改点击按钮的样式
  8. render(filterSex(sex, person));
  9. //render(addFn(filterFn,person));//组合条件筛选、渲染
  10. }
  11. })
  12. //点击按钮筛选
  13. function filterSex(sex, arr){
  14. if(sex == 'all'){
  15. return arr;
  16. }else{
  17. var sArr = arr.filter(function(ele, index){
  18. if(sex == ele.sex){
  19. return true;
  20. }
  21. })
  22. return sArr;
  23. }
  24. }

4)组合条件筛选:通过两个对象的prop把组合对象(输入框和按钮)和筛选函数联系起来

  1. //组合筛选,在一个筛选结果的基础上筛选(修改传入数组arr),参数lastArr上一次筛选返回的数组
  2. //筛选条件:实现筛选条件的函数
  3. var filterFn = {
  4. text: filterText,
  5. sex: filterSex
  6. }
  7. //筛选条件:之前的筛选的值text、sex 要改为
  8. var state = {
  9. text: '',
  10. sex: 'all'
  11. }
  12. //组合
  13. function addFn(obj, arr){
  14. var lastArr = arr;
  15. for(var prop in obj){
  16. lastArr = obj[prop](state[prop], lastArr);
  17. console.log(lastArr);
  18. }
  19. return lastArr;
  20. }