May 21

Percorrendo Javascript Objects como uma árvore binária

Tag: Javascriptdavid @ 2:41 pm

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…

Deixe um comentário