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))); })); };