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)));
}));
};
Interesante adaptación! Me pregunto si será fácil hacer que los métodos sean "lazy" y que se puedan concatenar, te lo dejo como ejercicio jeje
ResponderEliminarPor cierto, has probado a usar un framework como angular.js o backbone.js? Quizás no sea necesario reinventar la rueda!
Saludos.
Por cierto, has visto la página de solveet.com? Elige una kata y la hacemos en Javascript, si te apetece y tienes tiempo!
ResponderEliminar