May 21 2008
Percorrendo Javascript Objects como uma árvore binária
Estive dando uma revisada no meu material antigo nos últimos dias e acabei revendo uma série de vídeos do Doug Crockford (pela décima ou décima primeira vez, não me recordo precisamente, ainda estão no YUI! Theater e vocês deveriam assistir todos eles também, mais de uma vez) e em um dos trechos acabei me deparando com a já bem comentada função walkTheDom, usada para percorrer recursivamente um nó ou toda a árvore do DOM utilizando os recursos de reflection do Javascript de uma forma ou de outra.
function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}
Uma série de estruturas no browser se encaixam nesse paradigma, os próprios objetos Javascript são estruturas de dados que podem ser percorridas exatamente da mesma forma, e do mesmo jeito que o mestre Crockford percorre o DOM você pode pode percorrer um Objeto interrogando todos os seus elementos filhos a procura de quem interessa, um método de um objeto, um valor, um objeto específico. A coisa pode ficar realmente complexa se levarmos em consideração que um objeto js é uma cadeia de elementos sem um final definido, podemos ter um objeto que contenha um array de objetos que contenha um outro array de objetos e assim por diante. Para um exemplo prático dê uma olhada no objeto YAHOO utilizado como namespace na YUI! (e que na prática é um objeto js como qualquer outro):
Um exemplo inocente:
var walkThatObject = function(object, func){
for(var prop in object){
func(object[prop]);
if(typeof object[prop]== ‘object’){
walkThatObject(object[prop], func);
}
}
}
//Poderia ser uma literal de objeto aqui
var thatObject = {};
thatObject.Nome = ‘David’;
thatObject.Sobrenome = ‘Duarte’;
thatObject.Qualidades = {qualidade1:’Geek’, qualidade2:’Javascripter’, qualidade3:{subqualidade:’Bom filho’}};
walkThatObject(thatObject, function(obj){
if(typeof obj == ’string’){
alert(obj);
}
});
Interessante e “extremamente relevante” não? Pense nisso…


