jquery $().each和$.each()

本文介绍了jQuery中两种常见的遍历方法$().each和$.each()的使用技巧,包括如何处理DOM元素、数组及对象,并提供了具体实例。同时,还探讨了jQuery each方法背后的实现原理。

【转】遍历(一)jquery $().each和$.each()

 

在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法。

$().each 在dom处理上面用的较多。如果页面有多个input标签类型为checkbox,对于这时用$().each来处理多个checkbook,例如:

$(“input[name=’ch’]”).each(function(i){
if($(this).attr(‘checked’)==true)
{
//一些操作代码
}
回调函数是可以传递参数,i就为遍历的索引。

 

遍历一个数组通常用$.each()来处理  例如:

 
          

$.each([{name:"limeng",email:"xfjylimeng"},{name:"hehe",email:"xfjylimeng"}],function(i,n)
{
alert("索引:"+i+"对应值为:"+n.name);
});

参数i为遍历索引值,n为当前的遍历对象.


var arr1 = [ "one", "two", "three", "four", "five" ];
$.each(arr1, function(){
alert(this);
});
输出:one   two  three  four   five

var arr2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
$.each(arr2, function(i, item){
alert(item[0]);
});
输出:1   4   7

var obj = { one:1, two:2, three:3, four:4, five:5 };
$.each(obj, function(key, val) {
alert(obj[key]);
});
输出:1   2  3  4  5

 

其实jQuery里的each方法是通过js里的call方法来实现的。

下面简单介绍一下call方法。
call这个方法很奇妙,其实官方的说明是:“调用一个对象的一个方法,以另一个对象替换当前对象。”网上更多的解释是变换上下文环境,也有说是改变上下文this指针。
call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2,  , argN
可选项。将被传递方法参数序列。

说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

引用网上有一个很经典的例子

Js代码

function add(a,b){
alert(a+b);}
function sub(a,b){ alert(a-b);}
add.call(sub,
3,1);

 

用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

 

下面提一下jQuery的each方法的几种常用的用法

Js代码
var arr = [ “one”, “two”, “three”, “four”];
$.each(arr, function(){
alert(this);
});
//上面这个each输出的结果分别为:one,two,three,four

var arr1 = [[1, 4, 3], [4, 6, 6], [7, 20, 9]]
$.each(arr1, function(i, item){
alert(item[0]);
});
//其实arr1为一个二维数组,item相当于取每一个一维数组,
//item[0]相对于取每一个一维数组里的第一个值
//所以上面这个each输出分别为:1   4   7

var obj = { one:1, two:2, three:3, four:4};
$.each(obj, function(key, val) {
alert(obj[key]);
});
//这个each就有更厉害了,能循环每一个属性
//输出结果为:1   2  3  4

 

jQuery each源码

 

each: function( obj, callback ) {
        var length, i = 0;

        if ( isArrayLike( obj ) ) {
            length = obj.length;
            for ( ; i < length; i++ ) {
                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
                    break;
                }
            }
        } else {
            for ( i in obj ) {
                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
                    break;
                }
            }
        }

        return obj;
    }

 

 
 
 

转载于:https://www.cnblogs.com/liyuspace/p/8283741.html

### YOLOv5中的SPPF模块实现与作用 YOLOv5 的 SPPF(Spatial Pyramid Pooling - Fast)模块是一种优化本的空间金字塔池化技术,旨在通过减少计算复杂度来提高模型效率的同时保留特征提取能力。传统的 Spatial Pyramid Pooling (SPP)[^1] 使用多尺度的最大池化操作来捕获不同大小的感受野,而 SPPF 则简化了这一过程。 #### SPPF 模块的工作机制 SPPF 是一种快速空间金字塔池化方法,它仅采用单一最大池化层并重复应用多次以模拟多尺度感受野的效果。具体来说,在 YOLOv5 中,SPPF 模块通过对输入特征图执行一次最大池化操作,并将其结果叠加到原始输入上形成新的特征表示[^2]。这种设计显著降低了传统 SPP 方法所需的额外参数量和计算开销。 以下是 SPPF 模块的核心代码实现: ```python class SPPF(nn.Module): # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 def __init__(self, c1, c2, k=5): # equivalent to SPP(k=(5, 9, 13)) super().__init__() c_ = c1 // 2 # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c_ * 4, c2, 1, 1) self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2) def forward(self, x): x = self.cv1(x) with warnings.catch_warnings(): warnings.simplefilter('ignore') # suppress torch 1.9.0 max_pool2d() warning y1 = self.m(x) y2 = self.m(y1) return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1)) ``` 上述代码展示了如何构建一个基于卷积层和最大池化的简单网络结构。其中 `k` 参数定义了最大池化的核尺寸,默认设置为 5×5。该模块首先利用一个小卷积层降低通道数,随后连续三次调用相同大小的最大池化操作并将它们的结果拼接起来作为最终输出的一部分[^3]。 #### 应用场景及优势分析 在目标检测任务中,尤其是像 YOLO 这样的单阶段探测器里,有效处理具有广泛变化比例的目标至关重要。通过引入类似于 SPP 或者更高效的变体如 SPPF ,可以增强模型对于多种规模物体识别的能力而不增加太多训练时间成本或者推断延迟。 此外值得注意的是,在最新本的 YOLO 家族成员——即 YOLOv8 当中已经尝试替换了原有的 SPPF 组件,转而采用了名为 **Focal Modulation** 的新型注意力机制来进行更加精准高效的空间信息聚合工作 。不过这并不影响我们理解原生YoloV5所使用的经典解决方案及其背后的设计理念。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值