Desconferencia Barcamp V2

November 14th, 2011 by AlbertEin Leave a reply »

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());
Advertisement

Leave a Reply