ES5 every/some/reduce/reduceRight的使用與重寫

被作為實參傳入另一函數,并在該外部函數內被調用,用以來完成某些任務的函數,稱為回調函數。

break、return用于終止循環的區別:

  • return只能用在函數體內(單獨一個for循環里直接用return會報錯)
  • 對于多層循環:return直接終止,而break只是跳出所在層的循環

every

  • return后的表達式為條件
  • 如有一不滿足條件就停止遍歷
  • 返回值是布爾值
  • 可以改變this指向
  • 重寫
function myEvery(callback) {var arr = this,obj = arguments[1] || window;for (var i = 0; i < arr.length; i++) {console.log(i)if (!callback.apply(obj, [arr[i], i, arr])) {return false}}return true
}
Array.prototype.myEvery = myEvery
var arr = [1, 2, 3, 4, 5]
console.log(arr.myEvery((ele) => {return ele > 1
}))

some

  • 只要有一個條件滿足就停止遍歷
  • 返回值是布爾值
  • 可以改變this指向
function mySome(callback) {var arr = this,obj = arguments[1] || window;for (var i = 0; i < arr.length; i++) {console.log(i)if (callback.apply(obj, [arr[i], i, arr])) {return true}}return false
}
Array.prototype.mySome = mySome
var arr = [1, 2, 3, 4, 5]
console.log(arr.mySome((ele) => {return ele > 6
}))

reduce 歸納函數(重要)

  • 參數1:回調函數4參數:prev | ele, index, arr
  • 參數2:initVal(必傳)
  • prev的初始值是initVal給的
  • 每次循環可以操作prev
  • 類似filter,filter是過濾,返回(return)布爾值,就往容器里放
  • reduce是歸納,符合條件(if語句)就往容器里放
  • reduce返回新數組nArr即回調函數內return的內容(prev)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

  • 和map、forEach的區別,有了一個初始值initVal
// 將url參數轉為數組形式
var qs = 'v=1&_v=j90&aip=1&a=152878233&t=pageview&_s=1&dl=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FWeb%2FJavaScript%2FReference%2FGlobal_Objects%2FJSON%2Fstringify&ul=zh-cn&de=UTF-8&dt=JSON.stringify()%20-%20JavaScript%20%7C%20MDN&sd=24-bit&sr=1536x864&vp=1519x182&je=0&_u=QACAAAABAAAAAC~&jid=1406847847&gjid=1261334307&cid=1705225672.1581390240&tid=UA-36116321-5&_gid=1728790607.1622245970&_r=1&_slc=1&z=575736183'
var arr = qs.split('&')
var nArr = arr.reduce(function (prev, ele) {qArr = ele.split('=')prev[qArr[0]] = qArr[1]return prev
}, {})
console.log(nArr)
  • 重寫
function myReduce(callback, initVal) {var arr = this;var obj = arguments[2] || windowvar nResvar prevfor (var i = 0; i < arr.length; i++) {prev = i === 0 ? initVal : nResnRes = callback.apply(obj, [prev, arr[i]])}return nRes
}
Array.prototype.myReduce = myReduce
var qs = 'v=1&_v=j90&aip=1&a=152878233&t=pageview&_s=1&dl=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FWeb%2FJavaScript%2FReference%2FGlobal_Objects%2FJSON%2Fstringify&ul=zh-cn&de=UTF-8&dt=JSON.stringify()%20-%20JavaScript%20%7C%20MDN&sd=24-bit&sr=1536x864&vp=1519x182&je=0&_u=QACAAAABAAAAAC~&jid=1406847847&gjid=1261334307&cid=1705225672.1581390240&tid=UA-36116321-5&_gid=1728790607.1622245970&_r=1&_slc=1&z=575736183'
var arr = qs.split('&')
var nRes = arr.myReduce(function (prev, ele) {qArr = ele.split('=')prev[qArr[0]] = qArr[1]console.log(this)return prev
}, {}, { name: 'this' })
console.log(nRes)

在這里插入圖片描述

reduceRight

  • 從最后一個開始倒著遍歷,和reduce的順序相反
function myReduce(callback, initVal) {var arr = this;var obj = arguments[2] || windowvar nResvar prevfor (var i = 0; i < arr.length; i++) {prev = i === 0 ? initVal : nResnRes = callback.apply(obj, [prev, arr[i], i, arr])}return nRes
}
Array.prototype.myReduce = myReduce
Array.prototype.myReduceRight = function (callback, initVal) {var arr = this;var obj = arguments[2] || windowfor (var i = arr.length - 1; i >= 0; i--) {initVal = callback.apply(obj, [initVal, arr[i], i, arr])}return initVal
}
var arr = [1, 2, 3, 4, 5]
var nRes1 = arr.myReduce(function (prev, ele, index, arr) {prev.push(index + ':' + ele)return prev
}, [])
console.log(nRes1)
var nRes2 = arr.myReduceRight(function (prev, ele, index, arr) {prev.push(index + ':' + ele)return prev
}, [])
console.log(nRes2)

在這里插入圖片描述

練習

  • 實現模糊搜索
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><input type="text" id="J_searchInput" placeholder="請輸入小說"><ul class="J_list"><span>暫無數據</span></ul><div id="J_data" style="display: none;">[{"id":1,"name":"飛狐外傳","chargeFlag":0},{"id":2,"name":"雪山飛狐","chargeFlag":0},{"id":3,"name":"連城訣","chargeFlag":0},{"id":4,"name":"天龍八部","chargeFlag":1},{"id":5,"name":"射雕英雄傳","chargeFlag":1},{"id":6,"name":"白馬嘯西風","chargeFlag":0},{"id":7,"name":"鹿鼎記","chargeFlag":1}]</div><script type="text/html" id="J_tpl"><li>{{name}}</li></script><script>; (function (document) {var oInput = document.getElementById('J_searchInput')var data = JSON.parse(document.getElementById('J_data').innerHTML)var tpl = document.getElementById('J_tpl').innerHTML;var list = document.getElementsByClassName('J_list')[0]var emptyTpl = list.innerHTMLvar init = function () {bindEvent()}function bindEvent() {oInput.addEventListener('input', inputBlur, false)}function inputBlur(e) {// console.log(this.value) // 這就可以獲取valuevar e = e || window.event;var tar = e.target || e.srcElement;var tagName = tar.tagName.toLowerCase()if (tagName === 'input') {var foundNames = searchByName(tar.value)list.innerHTML = renderList(foundNames)}}function searchByName(key) {if (!key) {return []}return data.reduce(function (prev, ele) {// 模糊搜索var name = ele.namename.includes(key) ? prev.push(ele) : ''return prev}, [])}function renderList(data) {if (data.length === 0) {return emptyTpl}var list = ''data.forEach((item) => {list += tpl.replace(/{{(.*?)}}/g, function (node, key) {return {name: item.name}[key]})})return list}init()})(document)</script>
</body></html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251128.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

同步異步單線程多線程初級理解

對于我開始接觸同步異步單線程多線程的概念的時候&#xff0c;都是分別理解同步和異步、單線程和多線程概念&#xff0c;當看到“使用同步方法保證線程安全”時愚昧的理解為那就是單線程咯&#xff1b;于是就陷入了困惑&#xff0c;同步等于單線程嗎&#xff1f;下面是我自己不…

http --- 基本認證與摘要認證

基本認證: // (a)客戶端:查詢 GET /cgi-bin/checkout?cart17854 HTTP/1.1// (b)服務器:質詢 HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm"Shopping Cart"// (c)客戶端:響應 GET /cgi-bin/checkout?cart17854 HTTP/1.1 Authorization: Basic YnJpYW4…

對棧

1331【例1-2】后綴表達式的值 #include<bits/stdc.h>using namespace std;int sta[101];char s[256]; int comp(char s[256]){ int i0,top0,x; while(i<strlen(s)-2) { switch(s[i]) { case:sta[--top]sta[top1];break; case-:sta[--top]-sta[top1];break; case*:sta[…

hive中map相關函數總結

目錄 hive官方函數解釋示例實戰 hive官方函數解釋 hive官網函數大全地址&#xff1a; hive官網函數大全地址 Return TypeNameDescriptionmapmap(key1, value1, key2, value2, …)Creates a map with the given key/value pairs.arraymap_values(Map<K.V>)Returns an un…

【前端統計圖】echarts改變顏色屬性的demo

一&#xff1a;柱狀圖改變顏色 圖片.png代碼&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!-- 柱狀統計圖 --><div class"row"><div …

DOM-1 DOM初探、JS對象、XML、幻燈片案例展示

DOM DOM —— Document Object Model(文檔對象模型)DOM 對象 → 宿主對象&#xff08;是瀏覽器提供的&#xff09;通過瀏覽器提供的方法表示或操作HTML和XML不能操作css標簽&#xff1a;<></>對元素&#xff1a;<>及內部的內容,getElementsByTagName獲取的是…

http --- 密碼、密鑰、對稱(公開)密鑰加密系統、數字簽名、數字證書的一些概念

密碼(cipher) // 密碼是一套編碼方案和使用相應解碼方式的結合體 // *明文:使用密碼加密之前的稱為明文 // *密文:使用密碼進行加密的稱為密文最初的密碼是相當簡單的,很容易就可以破解,于是產生了密碼機: // 密碼機可以用復雜得多得密碼來快速、精確地對報文進行編碼.它們可…

elasticsearch5.x:查詢建議介紹、Suggester 介紹以及Java-api實現

elasticsearch5.x&#xff1a;查詢建議介紹、Suggester 介紹 參考&#xff1a;http://www.cnblogs.com/leeSmall/p/9206646.html 參考(重點)&#xff1a;https://elasticsearch.cn/article/142 參考&#xff08;官網&#xff09;&#xff1a;https://www.elastic.co/guide/en/e…

DOM-2 document對象、獲取元素、節點、遍歷樹

一、document獲取元素 1. 方法 document.getElementById(‘box’) // 在IE8及以下是不分大小寫的&#xff0c;而且name值也能匹配上document.getElementsByClassName(’’) // IE8及以下是用不了的document.getElementsByTagName() 都兼容document.getElementsByName() 用的非…

javascript --- js中的事件

事件實現松耦合: // JS和HTML之間的交互是通過事件實現的. // 事件,就是文檔或瀏覽器窗口中發生一些特定的交互瞬間. // 可以使用偵聽器來預定事件,以便事件發生時執行相應的代碼. // 這種在傳統軟件工程中被稱為觀察員模式的模型,支持頁面的行為與頁面的外觀之間的松耦合事件…

centos系統設置局域網靜態IP

---恢復內容開始--- centos系統設置局域網靜態IP 很多時候&#xff0c;我們并不希望漏油器重啟之后&#xff0c;自己的服務器動態的獲取IP&#xff0c;這樣很不利&#xff0c;因為你可能裝了mysql&#xff0c;redis&#xff0c;等軟件&#xff0c;然后需要遠程去訪問這臺服務器…

SQLServer數據庫(二)

數據庫設計&#xff1a;就是將數據庫中的數據庫實體及這些數據庫實體之間的關系&#xff0c;進行規劃和結構化的過程。 項目開發過程&#xff1a; 需求分析 概要設計 詳細設計 代碼編寫 運行測試 打包發行 數據庫的系統分析基本步驟&#xff1a;收集信息、標識實體、標識每個實…

DOM-3 【utils/待講評】節點屬性、方法、封裝方法、DOM結構

講評 節點屬性 nodeType 元素節點 1 大寫 屬性節點 2 文本節點 3 #text 注釋節點 8 #comment document 9 DocumentFragment 11 nodeName是只讀屬性元素節點的nodeName是大寫的其余的是#小寫的元素節點沒有nodeValue屬性&#xff0c;null&#xff0c;是可寫的其余有&#xff08…

javascript --- DOM0級、DOM2級、跨瀏覽器 的事件處理程序

DOM0級事件處理程序: // 使用DOM0級方法指定的事件處理程序被認為是元素的方法 // 這個時候的事件處理程序是在元素的作用域中運行: <div id "myBtn" >DOM0</div> <script>var btn document.getElementById("myBtn");btn.onclick fun…

collections deque隊列及其他隊列

from collections import dequedq deque(range(10),maxlen10) dq.rotate(3)#隊列旋轉操作接受一個參數N&#xff0c;讓N>0時&#xff0c;隊列的最右邊N個元素會被移動到隊列最左邊&#xff0c;反之會移到隊列最右邊 dq.appendleft(-1)#頭部添加dq.extend([11,22,33])#尾部添…

002 模板實參推斷、重載與模板

模板實參推斷 一、模板函數顯示實參 情況1&#xff1a; template <typename T1, typename T2, typename T3> T1 sum(T2 a, T3 b) {return a b; } 分析&#xff1a;調用的時候就需要指定T1的類型&#xff0c;如&#xff1a;sum<float>(1, 2); 于是sum函數的返回類型…

DOM-4 【utils/待講評】節點創建刪除、元素屬性設置獲取、節點屬性

講評 節點創建 Document.prototype ← document.createElement(div)document.createTextNode(xxx) // 創建文本節點document.createComment(xxx) // 創建注釋節點 增加/剪切子節點 Node.prototype ← node.appendChild(node)總是在父元素的最后增加&#xff08;類似push&am…

javascript --- 事件對象和事件類型

// 無論程序使用"DOM0級"規范還是"DOM2級"規范,都會在局部產生一個event對象, // 將其打印出來研究: <div id"divBtn"><button id"rawBtn" >Click Me!</button></div> <script>const divBtn document…

關于APP更新,兩包共存的解決方案

大多數是由于包名不一致導致的&#xff0c;一定要注意包名一致、不然手機會認為是兩個app&#xff0c;導致兩個包共存 查看包名的方法 1、hbuilder打包時會有提示 2、手機打開設置->應用->正在運行->對應app即可查看 轉載于:https://www.cnblogs.com/zz-0128/p/827969…

DOM-5【兼容】滾動距離與高度、兼容模式、可視尺寸

查看滾動條的距離 方法版本window.pageXOffset / pageYOffsetIE9/IE8及以下不支持(常規)document.body.scrollLeft/scrollTopIE9/IE8及以下(部分支持&#xff0c;具體看模式)document.documentElement.scrollLeft/scrollTopIE9/IE8及以下(部分支持&#xff0c;具體看模式)wind…