Jquery实现对Array数组实现类似Linq的Lambda表达式的Where方法筛选

平时使用Linq,习惯了Lambda表达式,用着非常顺手,奈何在Jquery里面不能这样用,只能循环一个个判断。
趁空闲时间找了找,自己写了这样的扩展方法。
目前写出了三种方案,没有比较性能,觉得都可以用,先贴出来。

 

方案1(使用$.each):

Array.prototype.where = function (callback) {
    if (typeof this == "object" && this.constructor == Array) {
        var newArr = [];
        $.each(this, function (i, item) {
            if (callback) {
                if (callback(item) == true) {
                    newArr.push(item);
                }
            }
        })
        return newArr;
    }
    else {
        return null;
    }
};

 

方案2(使用$.map):

Array.prototype.where = function (callback) {
    if (typeof this == "object" && this.constructor == Array) {
        return $.map(this, function (c) {
            if (callback) {
                if (callback(c) == true) {
                    return c;
                }
            }
            return null;
        })
    }
    else {
        return null;
    }
};

 

方案3(使用$.grep):

Array.prototype.where = function (callback) {
    if (typeof this == "object" && this.constructor == Array) {
        return $.grep(this, callback);
    }
    else {
        return null;
    }
};

 

调用方法:

var oldArr = [];
oldArr.push({ name: 'aa', word: '11' });
oldArr.push({ name: 'bb', word: '22' });
var newArr = oldArr.where(c => c.name == 'aa');

var newArr = oldArr.where(c => c.name == 'aa');

 

当然,其实jquery本身也有类似的方法可以用:

方案4(使用filter()方法):
var newArr = oldArr.filter(c => c.name == 'aa');

 

但是各种写法的性能未知,以后有情况再补了。

posted @ 2020-09-23 09:31  willgon  阅读(230)  评论(0)    收藏  举报