1. every
# every - every() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。 1. 语法: arr.every(callback, thisArg) 2. 参数: 1. callback -> 用来测试每个元素的函数, 可以接收三个参数: 1. element: 用于测试的当前值. 2. index(可选): 用于测试的当前值的索引. 3. array(可选): 调用every的当前数组. 2. thisArg(可选) -> 执行callback时使用的this值. 3. 返回值: 如果回调函数的每一次返回都为真, 返回true, 否则返回false. 4. 总结 如果有一个不满足条件就停止遍历, 条件就是return后面的表达式,并返回bool
Array.prototype.every = function(fn){ var arr = this, len = arr.length, arg2 = arguments[1] || window, res = true; for(var i = 0; i < len; i++){ if(!fn.apply(arg2, [arr[i], i, arr])){ res = false; break; } } return res;}
2. some
# some - some() 方法测试数组中是不是至少有一个元素通过了被提供的函数测试, 它返回的是一个Boolean类型 化的值 1. 语法 arr.some(callback, thisArg); 2. 参数 1. callback: 用来测试数组的每一个元素的函数,返回true表示该元素通过测试, 保留该元素, false则不保留,它接受以下参数: 1. element: 数组当前正在处理的元素. 2. index(可选): 正在处理的元素在数组中的元素 3. arr(可选): 被调用的数组 2. thisArg(可选) -> 执行callback, 用于this的值 3. 返回值 数组中有至少一个元素通过回调函数的测试就会返回true, 所有元素都没有通过回调函数才会返回 false 4. 总结: 只要有一个满足条件就停止遍历, 条件就是return后面的表达式 返回一个bool
Array.prototype.mySome = function(fn){ var arr = this, len = arr.length, arg2 = arguments[1] || window, res = false; for(var i = 0; i < len; i++){ if(fn.apply(arg2, [arr[i], i, arr])){ res = true; break; } } return res;}
3. reduce, reduceRight
# reduce-> 归纳函数 - reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。 1. 语法 [].reduce(function(prev, elem, index, arr){}, initialValue); 2. 参数 1. callback: reducer函数, 包含四个参数: 1. prev: 上一次调用callback返回值. 2. elem: 数组正在处理的元素. 3. index: 数组中正在处理的元素的索引. 4. arr: 用于遍历的数组. 2. initialValue: 作为第一次调用 callback 函数时参数 prev 的值。若指定了初始值 initialValue,则 elem 则将使用数组第一个元素;否则 prev 将使用数组第一个元素,而 elem 将使用数组第二个元素。 3. 返回值 使用reducer回调函数遍历整个数组的结果.
// 增加this可选Array.prototype.myReduce = function(fn, initialValue){ var arr = this, len = arr.length, arg3 = arguments[2] || window; for(var i = 0; i < len; i++){ initialValue = fn.apply(arg3, [arr[i], i, arr]); } return initialValue;}Array.prototype.myReduceRight = function(fn, initialValue){ var arr = this, len = arr.length, arg3 = arguments[2] || window; for(var i = len - 1; i >= 0 ; i--){ initialValue = fn.apply(arg3, [arr[i], i, arr]); } return initialValue;}
4. 搜索渲染小demo
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>搜索选项卡</title></head><body> <input type="text" id="j_searchInput"> <ul class="list"> <span>- 暂无课程 -</span> </ul> <div id="j_data" style="display: none"> [{"id": "1","course":"前端开发之企业级深度JavaScript特训课【JS++前端】","classes":"19","teacher":"小野","img":"ecmascript.jpg","is_free":"1","datetime":"1540454477","price":"0"}, {"id": "2","course":"WEB前端工程师就业班之深度JS DOM+讲师辅导-第3期【JS++前端】","classes":"22","teacher":"小野","img":"dom.jpg","is_free":"0","datetime":"1540454477","price":"699"}, {"id": "3","course":"前端开发之企业级深度HTML特训课【JS++前端】","classes":"3","teacher":"小野","img":"html.jpg","is_free":"1","datetime":"1540454477","price":"0"}, {"id": "4","course":"前端开发之企业级深度CSS特训课【JS++前端】","classes":"5","teacher":"小野","img":"css.jpg","is_free":"1","datetime":"1540454477","price":"0"}, {"id": "5","course":"前端就业班VueJS+去哪儿网+源码课+讲师辅导-第3期【JS++前端】","classes":"50","teacher":"哈默","img":"vuejs.jpg","is_free":"0","datetime":"1540454477","price":"1280"}, {"id": "6","course":"前端就业班ReactJS+新闻头条实战+讲师辅导-第3期【JS++前端】","classes":"21","teacher":"托尼","img":"reactjs.jpg","is_free":"0","datetime":"1540454477","price":"2180"}, {"id": "7","course":"WEB前端开发工程师就业班-直播/录播+就业辅导-第3期【JS++前端】","classes":"700","teacher":"JS++名师团","img":"jiuyeban.jpg","is_free":"0","datetime":"1540454477","price":"4980"}] </div> <script type="text/javascript"> ;(function(doc){ var data = JSON.parse(doc.getElementById('j_data').innerHTML), oSearchInput = doc.getElementById('j_searchInput'), oList = doc.getElementsByClassName('list')[0]; var init = function(){ bindEvent(); } function bindEvent(){ oSearchInput.addEventListener('input', searchInput, false); } function searchInput(){ var val = oSearchInput.value, len = val.length; if(len > 0){ var arr = reduceData(val, data); if(arr.length > 0) { oList.innerHTML = renderList(arr); }else{ oList.innerHTML = `<span>- 暂无课程 - </span>`; } }else{ oList.innerHTML = `<span>- 暂无课程 - </span>`; } } function reduceData(val, data){ var nArr = data.reduce(function(prev, elem){ if(elem.course.indexOf(val) !== -1){ prev.push(elem.course); } return prev; }, []); return nArr; } function renderList(arr){ var list = ''; arr.forEach(function(elem){ list += '<li>' + elem + '</li>'; }) return list; } init(); })(document); </script></body></html>