A los asistentes a mi desconferencia en el Barcamp V2 sobre funciones en javascript y otras hierbas les dejo el ejemplo final, implementando (badly) una clase que se comporta de manera similar a Linq (Tan solo implemento 3 métodos, select, where y groupBy). Una diferencia primordial es que en esta versión de javascript los métodos corren inmediatamente y no trabajan sobre Enumerables o similares como en .NET.
Para poder probar el código se debe de correr sobre Firefox, debido a que por pereza en el ejemplo del uso de groupBy llamo a toSource para mostrar el resultado y este método esta disponible en chrome.
Saludos.
function Linq(collection) { var items = collection; var iterate = function(operation) { for (var i = 0; i < items.length; i++) { operation(items[i], i); } }; this.reduce = function(init, reductor) { var results = init; iterate(function(item, index){ results = reductor(results, item); }); return results; } this.select = function(selector) { var results = new Array(); iterate(function(item, index) { results[index] = selector(item); }); return new Linq(results); }; this.where = function(filter) { var results = new Array(); var j = 0; iterate(function(item, index) { if (filter(item)) results[j++] = item; }); return new Linq(results); } this.groupBy = function(fieldSelector) { var dict = { }; iterate(function(item, index) { field = fieldSelector(item); if (dict[field] === undefined) dict[field] = { count: 0, items: new Array() }; dict[field].items[dict[field].count] = item; dict[field].count++; }); var i = 0; var results = new Array(); for (var item in dict) results[i++] = { key: item, items: dict[item].items }; return new Linq(results); }; this.toArray = function() { return collection }; this.toString = function() { return this.reduce("", function(base, item) { return base + item + ","; }); }; } function Dude(name, age) { this.name = name; this.age = age; } alert(new Linq([5, 6, 7]) .select(function(i) { return i * 3}) .where(function(i) { return i % 2 == 0 }).toString()); //Shows 18 var dudes = [ new Dude("A", 5), new Dude("B", 5), new Dude("C", 6), new Dude("D", 7), new Dude("E", 8), new Dude("F", 6) ]; var t = new Linq(dudes).groupBy(function (p) { return p.age }).toArray(); for (var i = 0; i < t.length; i++) alert(t[i].key + " - " + t[i].items.toSource());