en ES2015, Javascript, pixelovers, Programación Funcional

Cómo ordenar aleatoriamente y agrupar (elegantemente) un array de elementos

En el bootcamp en el que estoy dando clases en Irlanda (Code Institute) hoy tocaba TDD 🙂

Para practicar TDD les he propuesto unas katas y he pensado que la mejor manera de practicar esto era que hicieran pair-programming y que cada hora cambiaran de compañero. Para decidir las parejas he decidido crear un pequeño script que re-ordenara de forma aleatoria un array con los nombres de los alumnos y que además, los agrupara por parejas (o en grupos de 3, de 4 o de lo que hiciera falta en cada momento).

Como en mi opinión creo que  ha quedado un código interesante y útil al ordenar aleatoriamente pasandole una función (bastante ingeniosa) al metodo sort(), y al agrupar utilizando el metodo reduce(), lo comparto aqui por si a alguien le puede ser de utilidad (aunque sólo sea desde el punto de vista didáctico)

Aqui teneis el codigo en ES2015

var shuffleAndGroup = ( students, sizeGroups=2 ) => {
    var shuffled = students.sort( () => (.5-Math.random()) )
    var grouped = shuffled.reduce( ( acc, current, index ) => {
        index%sizeGroups ? acc[acc.length-1].push(current) : acc.push([current]);
        return acc;
    },[])
    return grouped;
}

Y aqui el codigo en ES5 un poco más desarrollado y explicado

function shuffleAndGroup ( students, sizeGroups ) {
    var sizeGroups = sizeGroups || 2;
    var shuffled = students.sort( function() { return .5 - Math.random(); })

    var grouped = shuffled.reduce( function( acc, current, index, array ) {
        
        if ( index%sizeGroups )  { 
            acc[acc.length-1].push(current) // add elements to the group
        }
        else { 
            acc.push([current]) // new group
        }
        return acc;
    },[])

    return grouped; // return an array of arrays (pairs)
}

Y aqui podeis ver el código en acción

[advanced_iframe src=»//jsfiddle.net/juanma/tvLff1rn/embedded/result,js/» width=»100%» height=»400″]

Post Anterior
Post Siguiente

Política de Comentarios de pixelovers

Responsable » Juan Manuel Garrido
Finalidad » Moderación de los comentarios
Legitimación » Tu consentimiento expreso que te será requerido por Disqus.
Destinatarios » Los datos de tus comentarios los guardará Disqus, mi sistema de comentarios, que está acogido al acuerdo de seguridad EU-US Privacy Shield tal y como recoge su politica de privacidad
Derechos » Desde Disqus, por tanto, podrás acceder, rectificar, limitar y suprimir tus comentarios o tu cuenta
Tienes más detalles acerca del tratamiento de los datos relacionados con los comentarios en nuestra (Política de Privacidad)

  1. Enhanced version

    
    function shuffleAndGroup ( students, sizeGroups ) {
        var sizeGroups = sizeGroups || 2;
    
        var shuffled = (function s( shuffled, times ) {
            var _s = shuffled.sort( function() { return .5 - Math.random(); });
            return --times ? s(_s, times) : _s;
        })(students,10000)
    
        var grouped = shuffled.reduce( function( acc, current, index, array ) {
    
            if ( index%sizeGroups )  {
                acc[acc.length-1].push(current) // add elements to the group
            }
            else {
                acc.push([current]) // new group
            }
            return acc;
        },[])
    
        return grouped; // return an array of arrays (pairs)
    }