martes, 8 de octubre de 2013

LINQ en JQuery

Ejemplo de LinQ en JQuery

Haciendo uso de la función Jquery $.grep y los métodos de extensión en Javascript, a continuación expongo un ejemplo de como implementar un "simulador" de Linq para JQuery.

Primero expongo una breve explicación, y abajo pego el código entero con ejemplos de uso.

Conceptos:

JQuery $.grep :  Es una utility de JQuery, que permite filtrar vectores de objectos. También pueden ser útiles $.map y $.each

prototype: Es la forma de extender métodos en javascript, el equivalente a los métodos de extensión en C#.

eval : Gracias a esta función javascript, que ejecuta una cadena como una función, cualquier expresión lógica es pasada como parámetro a las funciones y evaluada.


A continuación el código:


//LinQ to javascript extensions methods for class Array
//Need JQuery


// *** Samples of use ****

    //var myArray = [
    //                 { id: 1, name: "luis", checked: false }
    //                , { id: 2, name: "juan", checked: true }
    //                , { id: 3, name: "ana", checked: false }
    //];


    //console.log("Count sample: " + myArray.Count("item['checked']==true || item['id']==1"));
    ////word item it's not necessary
    //console.log("Count sample: " + myArray.Count("['checked']==true || ['id']==1"));
    //console.log("Count sample: " + myArray.Count("['name']=='luis'"));
    ////If not params, return array length
    //console.log("Count sample: " + myArray.Count());

    //console.log("FindFirst sample: " + myArray.FindFirst("['id']==1").id);
    //console.log("FindFirst sample: " + myArray.FindFirst().id);

    //console.log("Exists and FindFirst sample: " + (myArray.Exists("['name']=='anaXX'")
    //                                            ? myArray.FindFirst("['name']=='anaXX'").id
    //                                            : "not exits"));

    //var vectResult = myArray.Where("item['id']==2");

//*** Samples of use ****



function itemParser(str) {
    var result;

    result = str.replace("item", "");
    result = result.replace("[", "item[");

    return result;
}

//Extend Array with prototype

Array.prototype.Count = function (expr) {
    if (expr == null || expr == "") return this.length;

   
    return ($.grep(this, function (item, index) {
        return (eval(itemParser(expr)));
    }).length);
};


Array.prototype.FindFirst = function (expr) {
    if (expr == null || expr == "") expr = "true";

    var result = ($.grep(this, function (item, index) {
        return (eval(itemParser(expr)));
    }));

    return (result.length > 0 ? result[0] : null);
};


Array.prototype.Exists = function (expr) {
    if (expr == null || expr == "") expr = true;

    var result = ($.grep(this, function (item, index) {
        return (eval(itemParser(expr)));
    }));

    return (result.length > 0);
};


Array.prototype.Where = function (expr) {
    return ($.grep(this, function (item, index) {
        return (eval(itemParser(expr)));
    }));
};