Os loops são uma grande parte de diversas aplicações. Usamos eles para iterar dentro de listas, filtrar dados, retirar dados, analisar objetos, ordenar valores e muito mais.

Mas manter loops complexos pode trazer uma boa dor de cabeça para você e seu time. Diversos condicionais, alguns return e pouca manutenabilidade. Mas existe uma solução para este caos.

Lo-Dash é uma biblioteca de utilitários que traz diversos métodos interessantes para você brincar com arrays, objetos e muito mais.

Já faz algum tempo que uso o Lo-Dash (ou seu irmão mais velho underscore) nos meus projetos mais complexos. Ele me ajudou muito a escrever scripts mais legíveis e coesos. Inspirado por um post do Joel Hooks sobre abandonar completamente o uso do for, passei a utilizar o Lo-Dash ainda mais.

Começando com um exemplo mais simples, com ele podemos criar filtros facilmente:

var characters = [
    { 'name': 'barney', 'age': 36, 'blocked': false },
    { 'name': 'fred',   'age': 40, 'blocked': true }
];

_.filter(characters, { 'age': 36 });
// → [{ 'name': 'barney', 'age': 36, 'blocked': false }]

Podemos ir além e filtrar a partir do retorno de uma função:

var characters = [
    { 'name': 'barney', 'age': 36, 'blocked': false },
    { 'name': 'fred',   'age': 40, 'blocked': true },
    { 'name': 'john',   'age': 44, 'blocked': true }
];

_.filter(characters, function(character){
    return character.age >= 40;
});
// → [{ 'name': 'fred', 'age': 40, 'blocked': true },
//    { 'name': 'john', 'age': 44, 'blocked': true }]

Esses dois exemplos exigiriam algumas linhas de código a mais se fossem implementados com loops convencionais e com certeza deixariam o script mais difícil de entender.

Outro método interessante do Lo-Dash é o where, que analisa uma lista e a compara com um conjunto de chaves e valores, retornando um array com todas as correspondências.

_.where(listOfPlays, {author: "Shakespeare", year: 1611});
// → [{title: "Cymbeline", author: "Shakespeare", year: 1611},
//    {title: "The Tempest", author: "Shakespeare", year: 1611}]

Usar o Lo-Dash também permite facilmente que fujamos de um código sem coesão, já que na maioria de seus métodos é possível passar uma função como callback. Evitando o uso de funções anônimas, podemos inclusive tornar nosso código muito mais testável e legível.

var isOfLegalAge = function(person){
    return person.age >= 18;
}

_.filter(characters, isOfLegalAge);

Isto não é muito melhor que o loop abaixo?

var charactersOfLegalAge = [];
for (var i, len = characters.length; i < len; i++) {
    var character = characters[i];

    if (character.age >= 18) {
        charactersOfLegalAge.push(character);
    }
}

É claro que um for é mais rápido do que o _.filter. Mas em um projeto grande, com diversos desenvolvedores envolvidos, a legibilidade deve ser levada em conta antes do que a performance. Até porque seu impacto na performance em aplicações “normais” não é tão grande assim.

Se você vai usar apenas alguns métodos básicos e não precisa se preocupar com suporte para browsers antigos, você pode inclusive utilizar os métodos que vieram no EcmaScript 5.

O Lo-Dash conta com outras dezenas de métodos interessantes, módulo AMD, CommonJs e até pacotes para cada um de seus métodos. O legal disso é que ele pode ser usado tanto no client-side quanto do server-side. Não deixe de visitar o site do Lo-Dash para conhecer mais sobre esta incrível biblioteca.