本文详解如何使用原生JavaScript实现类似jQuery的each方法。该方法支持数组、对象及类数组(NodeList)的遍历,并解决了原生forEach无法处理对象及无法通过return实现continue/break的问题。代码展示了类型判断逻辑及回调函数的中断机制,帮助开发者在不依赖jQuery的情况下高效处理集合数据。
背景与需求分析
jQuery库中提供的each方法能够简化并便捷地执行循环操作。随后ECMAScript标准推出了forEach方法,尽管两者用法相似,但均无法直接处理对象类型,且无法通过return true来实现continue(继续)的效果。此外,还有一个every方法,虽然它能实现类似continue的功能,但在处理类数组和对象类型时完全无效。
当不使用jQuery的each方法时,应如何处理?或者说如何用原生JavaScript来实现这一功能?此前笔者编写了一个类库jTool,其中便实现了该方法。
原生each方法实现
以下是简单的实现代码。
// 通过字面量方式实现的函数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 i in object){
if(callback.call(object[i], i, object[i]) === false){
break;
}
}
}
}
功能测试与验证
接下来我们进行测试,验证该实现是否支持数组、对象、类数组类型以及中断效果。
首先测试数组类型。
var _array = [1,2,3,4];
each(_array, function(i, v){
console.log(i + ': ' + v);
});
输出结果如下。
接着测试对象类型。
var object = {a:1, b:2, c:3} each(object, function(i, v){ console.log(i + ': ' + v); });
输出结果如下。
随后测试类数组类型。
var ele = document.querySelectorAll('div');
each(ele, function(i, v){
console.log(i + ': ' + v);
});
输出结果如下。
增加中断条件的测试。
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的功能,且实现过程如此简单。
随笔一行:这是前端最好的时代,这也是前端最坏的时代。众多前端框架层出不穷,随着jQuery在前端行业的慢慢弱化,总是会有一种斯人远去,何者慰藉的感觉。互勉吧,各位。
另推荐一个表格组件gridManager。
总结
以上所述是小编给大家介绍的原生js实现each方法实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!