X

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
JuanMa Garrido: Senior Frontend Developer y Frontend Trainer, <a href="https://twitter.com/hashtag/Javascript?src=hash">#Javascript</a> specialist, co-founder de <strong><a href="http://anotherwaves.com/">anotherWaves</a></strong>, administrador de <a href="http://pixelovers.com"><strong>pixelovers</strong>,</a> autor de <a href="http://apuntesjs.com"><strong>Apuntes de Javascript</strong></a> 

View Comments (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)
    }