Listado completo de tutoriales

Array: métodos sort y reverse


Otro método muy útil de la clase Array es sort. La sintaxis más sencilla y por defecto es para ordenar una lista de string:

<!DOCTYPE html>
<html>

<head>
    <title>Ejemplo de JavaScript</title>
    <meta charset="UTF-8">
</head>

<body>

    <script>
        let nombres = ['marcos', 'ana', 'luis', 'jorge', 'carlos'];
        document.write('Vector antes de ordenarlo<br>');
        for (let f = 0; f < nombres.length; f++) {
            document.write(nombres[f] + '<br>');
        }
        nombres.sort();
        document.write('Vector después de ordenarlo<br>');
        for (let f = 0; f < nombres.length; f++) {
            document.write(nombres[f] + '<br>');
        }
    </script>

</body>

</html>

Como vemos creamos un vector con una lista de string:

        let nombres = ['marcos', 'ana', 'luis', 'jorge', 'carlos'];

Luego con llamar simplemente al método sort el mismo se encarga de intercambiar las componentes de tal forma que el menor alfabéticamente se encuentra al principio y así sucesivamente:

        nombres.sort();

Para ordenar una lista de enteros se complica el algoritmo ya que debemos pasar al método sort una función anónima indicando como implementar la comparación entre elementos:

<!DOCTYPE html>
<html>

<head>
    <title>Ejemplo de JavaScript</title>
    <meta charset="UTF-8">
</head>

<body>

    <script>
        let vec = [100, 5, 60, 3, 90];
        document.write('Vector antes de ordenarlo<br>');
        for (let f = 0; f < vec.length; f++) {
            document.write(vec[f] + '<br>');
        }
        vec.sort(function(v1, v2) {
            if (v1 < v2)
                return -1; // v1 es menor que v2
            else
                return 1; // v1 es mayor que v2
        });
        document.write('Vector después de ordenarlo<br>');
        for (let f = 0; f < vec.length; f++) {
            document.write(vec[f] + '<br>');
        }
    </script>

</body>

</html>

Como vemos al método sort hemos pasado una función que retorna un 1 o -1:

        vec.sort(function(v1, v2) {
            if (v1 < v2)
                return -1; // v1 es menor que v2
            else
                return 1; // v1 es mayor que v2
        });

Los parámetros v1 y v2 son los elementos que se comparan:

Si el contenido de v1 es menor que v2, se sitúa v1 en un indice menor que v2 (debe retornar un valor menor a cero)

Si el contenido de v1 es mayor que v2, se sitúa v2 en un indice menor que v1 (debe retornar un valor mayor a cero)

El siguiente método a analizar en éste concepto es reverse(), como podemos intuir este método invierte el orden de los elementos del vector. Nos puede ser de utilidad si tenemos ordenado un vector en orden ascendente y lo queremos en forma descendente.

Problema

Crear un vector con 10 elementos enteros con valores aleatorios. Ordenarlos de menor a mayor. Luego invertir el vector para verlo de mayor a menor.

<!DOCTYPE html>
<html>

<head>
    <title>Ejemplo de JavaScript</title>
    <meta charset="UTF-8">
</head>

<body>

    <script>
        let vec = new Array(10);
        for (let f = 0; f < vec.length; f++) {
            vec[f] = parseInt(Math.random() * 1000);
        }
        vec.sort(function(v1, v2) {
            if (v1 > v2)
                return 1;
            else
                return -1;
        });
        document.write('Vector ordenado en forma ascendente<br>');
        for (let f = 0; f < vec.length; f++) {
            document.write(vec[f] + '<br>');
        }
        vec.reverse();
        document.write('Vector ordenado en forma descendente<br>');
        for (let f = 0; f < vec.length; f++) {
            document.write(vec[f] + '<br>');
        }
    </script>

</body>

</html>

El resultado de ejecutar el programa es:

Vector ordenado en forma ascendente
32
131
329
364
488
515
860
864
919
919
Vector ordenado en forma descendente
919
919
864
860
515
488
364
329
131
32

Como vemos luego de imprimirlo en forma ordenada procedemos a llamar al método reverse() que invierte los elementos del vector (es decir el último pasa a ser primero, el anteúltimo pasa a ser segundo y así sucesivamente)

Problema

Definir un arreglo de cuatro elementos de tipo objeto, cada objeto representa una persona con su nombre y edad.
Imprimir el vector previo y posteriormente a su ordenamiento por la edad.

<!DOCTYPE html>
<html>

<head>
    <title>Ejemplo de JavaScript</title>
    <meta charset="UTF-8">
</head>

<body>

    <script>
        let personas = [{
            nombre: 'diego',
            edad: 53
        }, {
            nombre: 'carlos',
            edad: 26
        }, {
            nombre: 'ana',
            edad: 70
        }, {
            nombre: 'victoria',
            edad: 15
        }];
        document.write('Personas y sus edades<br>');
        for (let f = 0; f < personas.length; f++) {
            document.write('Nombre:' + personas[f].nombre + ' - ' + 'Edad:' + personas[f].edad + '<br>');
        }
        document.write('Personas ordenadas por su edad sus edades<br>');
        personas.sort(function(persona1, persona2) {
            if (persona1.edad > persona2.edad) {
                return -1;
            } else {
                return 1;
            }
        });
        document.write('Personas y sus edades<br>');
        for (let f = 0; f < personas.length; f++) {
            document.write('Nombre:' + personas[f].nombre + ' - ' + 'Edad:' + personas[f].edad + '<br>');
        }
    </script>

</body>

</html>

Ahora en la función anónima del método sort debemos acceder al atributo edad de cada persona:

        personas.sort(function(persona1, persona2) {
            if (persona1.edad > persona2.edad) {
                return -1;
            } else {
                return 1;
            }
        });

Retornar