模拟jquery实现each方法和map方法
********************each方法**********************
function each( obj, cbk ) {
/*
* 实现思路:
* 1、首先却分传入进来的是不是likeArray,
* 2、如果是采用 var i = 0 的遍历方法遍历所有的值,
* 然后把遍历到的下标和值依次传给回调使用,并且设置回调内部的this为遍历到的值
* 3、如果不是likeArray,才有for in的遍历方法遍历所有的值,
* 然后把遍历到的键和值依次传给回调使用,并且设置回调内部的this为遍历到的值
* 4、如果回调的返回结果是false,那么中断遍历
* */
var i, len;
// 如果是数组或者伪数组,才有vai i的方式遍历,效率比较高
if( 'length' in obj ) {
for( i = 0, len = obj.length; i < len; i++ ) {
// 把遍历到的键值传给回调使用,如果回调返回false,
// 那么证明对方不需要再遍历其他数据了,所以break跳出循环。
if( cbk.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
}
// 否则采用for in的遍历方式
else {
for( i in obj ) {
// 把遍历到的键值传给回调使用,如果回调返回false,
// 那么证明对方不需要再遍历其他数据了,所以break跳出循环。
if( cbk.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
}
return obj;
}
// 测试
var obj = { name: 'xx', age: 'xxx' };
var arr = [ {val:10}, {val:100}, {val:1000} ];
each( obj, function( key, val ) {
console.log( key, val, this );
} );
each( arr, function( index, val ) {
console.log( index, val, this );
// 如果遍历到的对象,val属性值为100,那么就不用遍历剩余的对象了
if( this.val == 100 ) {
return false;
}
} );
********************map方法**************************
/*
* jQ实例的map方法:
* map方法的本意是根据一组数组,按照对应的规则映射成另外一组数据返回。
* 1、返回给回调的参数先是下标,然后是值
* 2、回调函数执行时内部的this就指向遍历到的每一个值(就是回调中接收到的val)
* 3、收集回调返回的结果,如果不为null或undefined,那么存储起来,组成新的实例返回
* */
function map( obj, cbk ) {
/*
* 实现思路:
* 1、先却分遍历的对象是不是likeArr
* 2、是的话var i方式遍历,把遍历的数据传给回调,
* 同时指定回调内部的this为遍历到的值
* 3、不是for in方式遍历,把遍历的数据传给回调,
* 同时指定回调内部的this为遍历到的值
* 4、收集回调的返回结果,如果不为null或undefined,就存储起来,最终一起返回
* */
var i, len, temp, result = [];
if( 'length' in obj ) {
for( i = 0, len = obj.length; i < len; i++ ) {
temp = cbk.call( obj[ i ], i, obj[ i ] );
if( temp != null ) {
result.push( temp );
}
}
}else {
for( i in obj ) {
temp = cbk.call( obj[ i ], i, obj[ i ] );
if( temp != null ) {
result.push( temp );
}
}
}
return result;
}
// 测试
var obj = { name: 'xx', age: 'xxx' };
var arr = [ {val:10}, {val:100}, {val:1000} ];
console.log( map(obj, function (key, val) {
// 收集值为xxx的key
if (val === 'xxx') {
return key;
}
}));
console.log(map(arr, function (index, val) {
// 收集val大于10的对象
if (this.val > 10) {
return this;
}
}));
function map( obj, cbk ) {
/*
* 实现思路:
* 1、先却分遍历的对象是不是likeArr
* 2、是的话var i方式遍历,把遍历的数据传给回调,
* 同时指定回调内部的this为遍历到的值
* 3、不是for in方式遍历,把遍历的数据传给回调,
* 同时指定回调内部的this为遍历到的值
* 4、收集回调的返回结果,如果不为null或undefined,就存储起来,最终一起返回
* */
var i, len, temp, result = [];
if( 'length' in obj ) {
for( i = 0, len = obj.length; i < len; i++ ) {
temp = cbk.call( obj[ i ], i, obj[ i ] );
if( temp != null ) {
result.push( temp );
}
}
}else {
for( i in obj ) {
temp = cbk.call( obj[ i ], i, obj[ i ] );
if( temp != null ) {
result.push( temp );
}
}
}
return result;
}
// 测试
var obj = { name: 'xx', age: 'xxx' };
var arr = [ {val:10}, {val:100}, {val:1000} ];
console.log( map(obj, function (key, val) {
// 收集值为xxx的key
if (val === 'xxx') {
return key;
}
}));
console.log(map(arr, function (index, val) {
// 收集val大于10的对象
if (this.val > 10) {
return this;
}
}));
模拟jquery实现each方法和map方法的更多相关文章
- jquery中prop()方法和attr()方法
接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别. 原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. ...
- js进阶 12-13 jquery中one方法和trigger方法如何使用
js进阶 12-13 jquery中one方法和trigger方法如何使用 一.总结 一句话总结: 1.one()方法和on()方法的区别是什么? 除了one()只执行一次,其它和on()一模一样,包 ...
- jquery中attr方法和prop方法的区别
关于checked的属性,最重要的概念就是你要记住,它跟checked的状态值是毫无关系的,设置checked = "checked"或者checked = "true& ...
- jQuery中bind方法和live方法区别解析
Javascript中的事件有它的独特性,有默认的执行事件,例如冒泡就是其中的一个.在很多比较复杂的应用程序中,停止事件的冒泡或捕获在程序开发当中是十分有用的,而在IE中有它的独特方式来阻止事件的冒泡 ...
- jquery中prop()方法和attr()方法的区别浅析
官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了prop()这个新方法,不可能没用吧,那什么时候该用attr(),什么时候该用prop()呢 jquery1.6中新加了一个方法pr ...
- jquery中prop()方法和attr()方法的区别
最近在用jquery的时候遇到一个问题,那就是attr()方法,发现这个方法有时候使用会有一些说不出原因的问题.翻翻自己之前笔记发现,还有个函数prop(). 这两个函数都可以用来获取属性. jque ...
- jquery中prop()方法和attr()方法的区别(转)
jquery1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了pro ...
- jQuery ajax - getScript() 方法和getJSON方法
实例 使用 AJAX 请求来获得 JSON 数据,并输出结果: $("button").click(function(){ $.getJSON("demo_ajax_js ...
- jQuery中hover方法和toggle方法使用指南
jQuery提供一些方法(如:toggle)将两种事件效果合并到一起,比如:mouseover.mouseout:keyup.keydown等 1.hover函数 hover(over,out)一个模 ...
随机推荐
- [转] C语言常见笔试题大全1
点击阅读原文 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL) [ ...
- linux Nginx VirtualHost虚拟主机多站点设置
linux系统CentOS7 Nginx1.9.9 一台nginx服务器同一IP被注册多个不同域名,访问不同域名到该服务器后请求不同项目 本台nginx服务器的IP地址为 192.168.155.12 ...
- laravel框架总结(五) -- 服务提供者(提及契约Contracts)
首先理解两个概念 1.契约:一组定义了框架核心服务的接口 2.服务提供者:所有 Laravel 应用程序启动的中心所在. 包括你自己的应用程序,以及所有的 Laravel 核心服务,都是通过服务提供者 ...
- easylui datagrid 动态生成列
function load(sdate) { $.getJSON("workorder/statistics.do", { sdate : sdate+'-01' }, funct ...
- Cmap的使用
1.定义 template <class KEY,class ARG_KEY,class VALUE, class ARG_VALUE> class CMap:public CObject ...
- EFS解密----未重装系统
一种方法.(手动删除私钥测试通过) 利用软件advanced efs data recovery 二种方法. 前提:在系统未重装或私钥未丢失.两个软件: PsExec和 IceSword.前者是国外 ...
- Spring 源码学习
spring最核心的理念是IOC,包括AOP也要屈居第二,那么IOC到底是什么呢,四个字,控制反转 一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们 ...
- 有限状态机(Python)
有限状态机(Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.FSM是一种算法思想,简单而言,有限状 ...
- 【转】 CPU大小端
大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 为什么会有大小端模式之分呢?这是因为 ...
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的
在MVC中添加授权认证配置之后报了这样的错 原因是在整个MVC项目中有两个Web.Config文件存在authentication节点,一个Web.Config文件在View目录下,一个在根目录下 解 ...