ES5 数组扩展方法 forEach/filter/map的使用与重写

ES3 splice slice join sort (IE5、IE6)
数组扩展方法 ES5(在ES3的基础上增加、修正)

forEach

  • 可能会改变原数组(直接操作了arr[i],没有使用深拷贝)
  • 参数1:回调函数(如果不使用箭头函数,则内部this指向window)
  • 参数2:用来改变参数1内部的this指向,和call一样,null/undefined指向window,原始值会被包装
data.forEach(function (ele, index, array) {this[index].innerHTML = ele.course
}, oLI)

重写forEach

  • 思路
function myForEach(callback, obj) {var arr = thisfor (var i = 0; i < arr.length; i++) {callback.call(obj, arr[i], i, arr)}
}
Array.prototype.myForEach = myForEach
// 注意:要改变this指向,不能写箭头函数
arr.myForEach(function (ele, index, array) {console.log(this.name, ele, index, array)
}, { name: 1 })

在这里插入图片描述

filter 筛选、过滤

  • 可能会改变原数组
  • 返回一个新的数组
  • 思路,回调函数return true时,将元素添加到数组
  • 所以,都不符合的情况下,filter会返回空数组
var arr = [{ name: 'Stephy Huang' },{ name: 'William Wong' },{ name: 'Jessica Jung' },{ name: 'Krystal Jung' },
]
function myFilter(callback) {
var obj = arguments[1]
var arr = this
var resArr = []
for (var i = 0; i < arr.length; i++) {if (callback.call(obj, arr[i], i, arr)) {resArr.push(arr[i])}
}return resArr
}
Array.prototype.myFilter = myFilter
var res = arr.myFilter(function (ele, index, array) {return ele.name.includes('Jung')
})
console.log(res)
  • 重写时进行优化:使用深拷贝,否则操作newArr,会改变原数组arr;或是直接在callback修改ele,也会修改arr
  • 深拷贝同样可以用于map方法的重写优化
    在这里插入图片描述

map

  • 可能会改变原数组
  • 思路,将callback的返回值加入数组,最终返回数组
var arr = [{ name: 'Stephy Huang' },{ name: 'William Wong' },{ name: 'Jessica Jung' },{ name: 'Krystal Jung' },
]
function myMap(callback) {var obj = arguments[1]var arr = thisvar resArr = []for (var i = 0; i < arr.length; i++) {var item = arr[i]var res = callback.call(obj, item, i, arr)resArr.push(res)}return resArr
}
Array.prototype.myMap = myMap
var res = arr.myMap(function (ele, index, array) {if (ele.name.includes('Jung')) {return ele}// 对于不符合条件的,函数默认return undefined
})
console.log(arr)
console.log(res)

在这里插入图片描述

练习

<!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><p class="J_nav"><a href="javascript:;" data-field="all">全部小说</a><a href="javascript:;" data-field="free">免费小说</a><a href="javascript:;" data-field="vip">vip小说</a></p><ul class="J_list"></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 type="text/javascript">// 模块化; (function () {// onload  = init;// init → 点击事件var oNav = document.getElementsByClassName('J_nav')[0],oList = document.getElementsByClassName('J_list')[0],data = JSON.parse(document.getElementById('J_data').innerHTML),tpl = document.getElementById('J_tpl').innerHTML;var init = function () {bindEvent()oList.innerHTML = renderList(filterData('all'))}function bindEvent() {oNav.addEventListener('click', navClick, false)}function navClick(e) {var e = e || window.event,tar = e.target || e.srcElement,tagName = tar.tagName.toLowerCase();if (tagName === 'a') {var field = tar.getAttribute('data-field')oList.innerHTML = renderList(filterData(field))}}function filterData(field) {var chargeFlagswitch (field) {case 'free':chargeFlag = 0break;case 'vip':chargeFlag = 1break;default:break;}return data.filter((ele) => {return typeof chargeFlag !== 'undefined' ? ele.chargeFlag === chargeFlag : true})}function renderList(data) {var list = ''data.forEach((item) => {list += tpl.replace(/{{(.*?)}}/g, function (node, key) {return {name: item.name}[key]})})return list}init()})()</script>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

187. Repeated DNA Sequences重复的DNA子串序列

&#xff3b;抄题&#xff3d;&#xff1a; All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. Write a fun…

ES5 every/some/reduce/reduceRight的使用与重写

被作为实参传入另一函数&#xff0c;并在该外部函数内被调用&#xff0c;用以来完成某些任务的函数&#xff0c;称为回调函数。 break、return用于终止循环的区别&#xff1a; return只能用在函数体内&#xff08;单独一个for循环里直接用return会报错&#xff09;对于多层循环…

【前端统计图】echarts改变颜色属性的demo

一&#xff1a;柱状图改变颜色 图片.png代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!-- 柱状统计图 --><div class"row"><div …

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;然后需要远程去访问这台服务器…

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…

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…

DOM-6 【兼容】读写样式属性、操作伪元素、运动元素初探

规范 <style type"text/css"></style><script type"text/javascript"></script>读写样式属性 .style是访问不到css样式表的&#xff0c;只能访问到行内/内联的属性&#xff0c;当未设置行内属性时&#xff0c;结果为空字符串 设…

RGBD论文阅读笔记

Single-Image Depth Perception in the Wild 简要记载一下对于利用RGB图像depth图像得到segmentation的论文。 论文名称&#xff1a;Cascaded Feature Network for Semantic Segmentation of RGB-D Images 论文出处 ICCV 2017 Lin 模型结构 数据集 NYUDv2 SUN-RGBD 性能分析 总…

vue组件调用(全局调用和局部调用)

当用vue-cli创建一个项目后, 创建项目的方法: https://www.cnblogs.com/fps2tao/p/9376847.html 编写了组件怎么,在其他组件中调用了? 组件listBox: 路径 src/components/listBox.vue <template><div class"listBox">listBox222</div> </templ…

DOM-7 【兼容】事件处理函数、冒泡捕获、阻止冒泡默认事件

事件处理函数 绑定事件 绑定事件的处理函数&#xff08;事件本身是存在的&#xff0c;绑定的是相应的反馈&#xff09;事件 事件的反馈 前端交互 &#xff08;前端核心&#xff09; 绑定事件的方式 1. 句柄绑定 默认&#xff08;只能&#xff09;是事件冒泡这种事件流为…

DOM-8 【兼容】冒泡捕获流、事件与事件源对象、事件委托

事件流 1. 含义 描述从页面中接收事件的顺序 2. 分类 IE提出的 事件冒泡流 Event BubblingNetscape提出的 事件捕获流 Event Capturing 3. 阶段 事件捕获阶段 处于目标阶段 事件冒泡阶段 事件捕获先于事件冒泡执行 dom dom0&#xff1a;定义句柄方式&#xff0c;兼…

IIS6.0,Apache低版本,PHP CGI 解析漏洞

IIS6.0解析漏洞 在IIS6.0下存在这样的文件“名字.asp;名字.jpg” 代表了jpg文件可以以asp脚本类型的文件执行。 根据这个解析漏洞我们可以上传这种名字类型的图片&#xff0c;比如 1.asp;xxx.jpg 他会忽略;后边的内容&#xff0c;所以文件相当于1.asp asp一句话木马 <%eval …

UVA 3485 Bridge

题目大意 你的任务是修建一座大桥。桥上等距地摆放着若干个塔&#xff0c;塔高为H&#xff0c;宽度忽略不计。相邻两座塔之间的距离不能超过D。塔之间的绳索形成全等的对称抛物线。桥长度为B&#xff0c;绳索总长为L&#xff0c;如下图所示求建最少的塔时绳索的最下端离地的高度…