Lodash: deja de perder tiempo en detalles

Es un caso familiar al tratar con muchos datos, o sobre todo al comunicar sistemas de distinto origen, el tema del pre o post (depende del momento en que te fijes) procesamiento de la data.

Es que tengo que sacar la llave name que viene dentro del primer objeto de cada elemento de la respuesta, pero luego necesito extender el arreglo que obtengo al aplanar el tercer objeto, y luego, si es Jueves, filtrar todos los elementos repetidos, y luego...

Es, para algunos, entretenido comenzar la cascada de ideas que se te vienen a la cabeza cuando empiezas a dislumbrar todos los pasos requeridos para lograr limpiar u obtener la data que deseas. Es menos entretenido tener que implementar funciones para cada uno de estos pasos y, dependiendo de la complejidad del objeto al que procesarás, el tiempo, esfuerzo y líneas de código simplemente no valdrán la pena.

Y se vuelve peor, dado que ninguno de estos procedimientos tiene que ver con tu idea principal, es sólo procesamiento de datos: mover arreglos para acá, tomar algunos campos, filtrar por condiciones. Puros detalles que, aunque necesarios, no valen tu tiempo.

En el mundo de Node y Javascript, alguien ya se dio cuenta de esto, y escribió _ (lodash), justamente para manejar esas tareas sin perder valioso tiempo.
Lodash se define como una librería utilitaria que entrega modularidad y rendimiento. Tiene sentido, muchas de estas tareas molestas tendremos que hacerlas más de una vez.
Veamos algunos ejemplos

Caso: necesitas un número aleatorio entre A y B
function getRandom(min, max){  
    return Math.floor(Math.random() * (max - min + 1)) + min;
}
getRandom(1,10)  

Nada muy complicado, pero en lodash esto es _.random(1,10). Y se agregas el parámetro true, te devuelve flotantes en vez de enteros.

Caso: Extender un objeto con los campos de otro objeto

La buena práctica dice extender el prototipo de Object (hasOwnProperty para sacar sólo los campos que tú pusiste y no los que se heredan y todo eso)

Object.prototype.extend = function(obj) {  
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            this[i] = obj[i];
        }
    }
};
oneObject.extend(someOtherObject)  

Con lodash esto queda _.assign(oneObject, someOtherObject).
La misma función acepta múltiples objetos. _.assign(oneObject, someOtherObject, noWayAnotherOne).

Oh!

La función pick hace algo parecido, escoges qué propiedades quieres tomar de otro objeto. Con .omit escoges cuáles propiedades eliminas de un objeto.

Caso: Quieres 'aplanar' los contenidos de un arreglo

Con aplanar, hablamos de quitar dimensiones a un arreglo multidimensional hasta dejar una simple lista.

[1, [1,2], [3,4], [5]] => [1,1,2,3,4,5]

No incluiré muestras de código puro, porque prefiero hablar de la complejidad de una posible función que resuelva el problema. (y porque realmente no quiero hacerlo)
Si tu arreglo de entrada tiene un schema definido, no hay mayor problema: siempre es el mismo caso, aún cuando sea complejo y profundo. Pero ¿qué pasa si no sabes la estructura del arreglo de entrada? Un acercamiento abstracto es la solución, que considere todos los casos, que sea iterativa, o si te gusta el peligro, recursiva.

De cualquier manera, tener que considerar los distintos escenarios para una simple función utilitaria, considerar también la eficiancia de las propuestas, tiempo de desarrollo, gusto del code-reviewer, bla bla...y que además no entrega nada a tu propuesta de valor, puede volverse rídiculo.
Yo cuando hago debug sobre código de apoyo

_.flattenDeep([1, [2, [3, [4]], 5]]);  
// [1,2,3,4,5]
// BOOM! go back to the important things

Conclusión

Si odias los detalles al momento de programar, y te gusta centrar tu atención en el núcleo de tus tareas, busca y utiliza librerías de utilidades para sacarte peso de encima. Ahorrarás tiempo, esfuerzo, líneas de código y sobre todo tiempo.

Lodash está disponible como módulo para Node y como archivo Javascript para el navegador. También está underscore.js, una especie de versión liviana de lodash (aunque son proyectos distintos).

Para Python existe Pydash, inspirada en lodash. Para Ruby no pude encontrar una solución transversal, probablemente porque Ruby ya incluye métodos de estilo similar en el lenguaje y Rails las amplia aún más.

La documentación completa de lodash está aquí. Si vas a utilizar la librería, recomiendo darte una laaaaaaarga vuelta por la documentación, se lee rápido y evitará esta reacción cuando descubras que la función que ya escribiste a la rápida, sin testear y que probablemente no considera un par de casos, ya existe.