利用数组的filter方法实现。
一个给定的后台数据包含了很多属性(姓名,性别,年龄等等)对此我们要进行特定的数据筛选。
var person = [
{ name: '刘小华', src: '1.jpg', sex: 'male', des: '漂亮的女孩子' },
{ name: '王花', src: '2.jpg', sex: 'male', des: '漂亮的程序猿' },
{ name: '陈军', src: '3.jpg', sex: 'female', des: '我是一个学霸' },
{ name: '王华', src: '4.jpg', sex: 'female', des: '我喜欢游泳' },
{ name: '陈思思', src: '5.jpg', sex: 'male', des: '我喜欢看电影' },
{ name: '马学习', src: '6.jpg', sex: 'female', des: '我爸我妈爱学习' },
{ name: '马美丽', src: '7.jpg', sex: 'male', des: '我妈是美丽得妈妈' },
{ name: '马冬梅', src: '7.jpg', sex: 'male', des: '我妈是美丽得妈妈' }
];
var oUl = document.getElementById('list1'); //获取HTML中的需要插入li的ul
var oInp = document.getElementById('inp'); //获取输入姓名的输入框
var sexUl = document.getElementsByClassName('list')[0]; //获取性别选项框(ul里的li)
function render(list) {
var str = '';
list.forEach(function (ele, index) {
// ele.name/ele.src/ele.des
str += '<li>\
<img src="./'+ ele.src + '" alt="">\
<span class="name">'+ ele.name + '</span>\
<span class="ms">'+ ele.des + '</span>\
</li>'
})
oUl.innerHTML = str;
}
render(person); //初始是渲染结构样式(没有进行筛选)
oInp.oninput = function () { //获取输入框的值
var value = this.value;
render(filterText(value, person));
//render(addfn(filter, person)); 叠加筛选的写法
}
//根据输入框的值筛选出对应的新数组交给render方法进行渲染
function filterText(text, arr) {
return arr.filter(function (ele) {
if (ele.name.indexOf(text) !== -1) { //筛选出满足的数据
return true;
}
})
}
//给性别选项添加点击事件
sexUl.addEventListener('click', function (e) {
if (e.target.tagName == 'LI') {
var sex = e.target.getAttribute('sex');
render(filterSex(sex, person));
//render(addfn(filter, person)); 叠加筛选写法
}
})
//筛选出需要的性别
function filterSex(sex, arr) {
if (sex == 'all') {
return arr;
} else {
return arr.filter(function (ele, index) {
if (sex == ele.sex) {
return true;
}
})
}
}
//根据内容筛选value--->filter筛选数组(newArr)-->新数组-->render(newArr)-->筛选渲染成功
以上能实现简单的筛选。但是我们需要的是能在姓名或者性别筛选后再次筛选。
叠加筛选:
//创建两个对象保存着筛选函数的函数名,一个保存着当前筛选状态的对象
var filter = {
value : filterText,
sex : filterSex
}
var state = {
value : '',
sex : 'all'
}
//叠加筛选,lastArr开始保存着初始数据(因为没调用筛选功能)
function addfn(obj,arr){
var lastArr = arr; //再次调用时获取的是上次筛选出来的数据
for(var prop in obj){
lastArr = obj[prop](state[prop],lastArr);
}
console.log(state[prop]);
return lastArr;
//调用筛选方法赋值给lastArr,这样就能实现多次筛选。
}
对于整体的封装和选项框的防抖问题。下次探讨~