在jQuery的.first()方法中添加谓词

时间:2012-09-17 14:25:08

标签: javascript jquery

是否可以在不大大影响原始源代码的情况下扩展jQuery .first()方法,以便它可以接受谓词参数?从根本上说,我想要它做的是类似于LINQ的.First(),C#方法。在JavaScript中,它看起来像这样:

function first(arr, predicate) {
    for (var i = 0; i < arr.length; i++) {
        // return the first item fulfilling the predicate
        if (predicate.call(arr[i])) {
            return arr[i];
        }
    }
}

var myArray = [1, 3, 5],
    myPredicate = function() {
        return this >= 2;
    };

var result = first(myArray, myPredicate); // should give '3'

我知道用JavaScript可以很容易地实现它;我很好奇是否可以在jQuery中轻松扩展现有方法。

使用的解决方案:

$.fn.firstOne = function(predicate) {
    // validate the predicate is a function
    if ($.isFunction(predicate)) {
        // iterate through each item, finding the first match
        for (var i = 0; i < this.length; i++) {
            if (predicate.call(this.eq(i), i)) {
                return this.eq(i);
            }
        }
    }

    // maintain chainability
    return $();
};

2 个答案:

答案 0 :(得分:3)

您可以根据需要轻松(并安全地)创建自己的方法,

$.fn.firstfn = function(fn) {
    return this.filter(fn).first()
}

$("#nav > li").firstfn(function() {
    return $(this).text() === "John Smith";
});

但是我不建议您覆盖现有方法。只需添加自己的方法。

答案 1 :(得分:1)

您可以使用自己的函数see this question for how to do this

轻松扩展jQuery

但是它已经内置了选择器来使用谓词/选择器来执行first()。以下是一些例子

$("#mycontainer li.classYouWant").first();
$("#mycontainer").find("another selector").first();
$("#mycontainer li a:first");