博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript笔记——源生js实现each方法
阅读量:5007 次
发布时间:2019-06-12

本文共 1908 字,大约阅读时间需要 6 分钟。

出处:http://www.lovejavascript.com/#!zone/blog/content.html?id=48

jquery里面有个each方法,将循环操作简化、便捷。

随后es出了个forEach方法,两个虽然用法相近,但是不能处理对象类型。且无法通过return true达到continue效果。

此外还有个every方法,该方法虽然可以实现continue效果,但是在处理类数组与对象类型时,完全无用。

 

在不使用jquery的each方法时,该如何处理;或者说用原生如何来实现?我在GridManager.js中集成了该方法,代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 通过字面量方式实现的函数each
var 
each =  
function
(object, callback){
  
var 
type = (
function
(){
          
switch 
(object.constructor){
            
case 
Object:
                
return 
'Object'
;
                
break
;
            
case 
Array:
                
return 
'Array'
;
                
break
;
            
case 
NodeList:
                
return 
'NodeList'
;
                
break
;
            
default
:
                
return 
'null'
;
                
break
;
        
}
    
})();
    
// 为数组或类数组时, 返回: index, value
    
if
(type === 
'Array' 
|| type === 
'NodeList'
){
        
// 由于存在类数组NodeList, 所以不能直接调用every方法
        
[].every.call(object, 
function
(v, i){
            
return 
callback.call(v, i, v) === 
false 
false 
true
;
        
});
    
}
    
// 为对象格式时,返回:key, value
    
else 
if
(type === 
'Object'
){
        
for
(
var 
in 
object){
            
if
(callback.call(object[i], i, object[i]) === 
false
){
                
break
;
            
}
        
}
    
}
}

 

我们来try一下, 测试下数组、对象、类数组类型及中断效果

数组类型:

 

1
2
3
4
var 
_array = [1,2,3,4];
each(_array, 
function
(i, v){
  
console.log(i + 
': ' 
+ v);
});

输出如下:

 

对象类型:

 

1
2
3
4
var 
object = {a:1, b:2, c:3}
each(object, 
function
(i, v){
  
console.log(i + 
': ' 
+ v);
});

输出如下:

 

类数组类型 :

 

1
2
3
4
var 
ele = document.querySelectorAll(
'div'
);
each(ele, 
function
(i, v){
  
console.log(i + 
': ' 
+ v);
});

输出如下:

 

增加中断条件:

 

1
2
3
4
5
6
7
8
9
10
11
12
var 
object2 = {name:
'baukh'
, age: 
'29'
, six:
'男'
, url: 
'www.lovejavascript.com'
,}
each(object2, 
function
(i, v){
  
if
(i === 
'age'
){ 
//如果存在键值为age的属性时,则输出警告,用于实现continue效果
    
console.log(
'存在键值为age,这家伙已经'
+v+
'岁了'
);
    
return 
true
;
  
}
  
if
(i === 
'six' 
&& v === 
'男'
){
//如果存在键值为age的属性时,则输出跳出,用于实现break效果
    
console.log(
'存在键值为six,是个男的,不用关注了~'
);
    
return 
false
;
  
}
  
console.log(i + 
': ' 
+ v);
});

输出如下:

从结果可以看出来,each方法已经实现了jquery的each功能。且实现如此简单~

 

转载于:https://www.cnblogs.com/MonaSong/p/6424366.html

你可能感兴趣的文章
shell学习1shell简介
查看>>
VM虚拟机下安装Centos7.0图文教程
查看>>
Javascript 汉字转拼音
查看>>
简单工厂模式
查看>>
Android(java)学习笔记205:JNI之编写jni程序适配所有处理器型号
查看>>
11.3 字典复习
查看>>
实用SQL
查看>>
走在Android开发的路上(二):Android快速入门
查看>>
Hbase取数据问题Bug
查看>>
《你的灯还亮着吗》阅读笔记三
查看>>
POJ2533 Longest ordered subsequence
查看>>
大话设计模式之简单工厂模式
查看>>
如何创建ASM磁盘?
查看>>
利用U盘安装Cent OS 7操作系统
查看>>
贝塞尔曲线值
查看>>
通用链表实现(参考Linux List)
查看>>
Cider扩展架构:AttributeTable和AttributeTableBuilder
查看>>
phpMyAdmin项目已迁移至GitHub
查看>>
内存利用率
查看>>
JRuby 1.7.0 发布:默认使用Rudy1.9 模式,并可使用InvokeDynamic
查看>>