JavaScript Sorting Arrays

JavaScript Sorting Arrays

Contenido original de W3Schools


Ordenar una matriz

El método sort() ordena una matriz alfabéticamente:

Ejemplo:

const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();

Ver ejemplo


Invertir una matriz

El método reverse() invierte los elementos de una matriz.

Puedes usarlo para ordenar una matriz en orden descendente:

Ejemplo:

const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.reverse();

Ver ejemplo


Orden numérico

De forma predeterminada, la función sort() ordena los valores como cadenas.

Esto funciona bien para cadenas ("Apple" viene antes de "Banana").

Sin embargo, si los números se ordenan como cadenas, "25" es mayor que "100", porque "2" es mayor que "1".

Debido a esto, el método sort() producirá resultados incorrectos al ordenar números.

Puedes solucionar este problema proporcionando una función de comparación:

Ejemplo:

const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});

Ver ejemplo

Utilice el mismo truco para ordenar una matriz de forma descendente:

Ejemplo:

const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});

Ver ejemplo


La función de comparación

El propósito de la función de comparación es definir un orden de clasificación alternativo.

La función de comparación debe devolver un valor negativo, cero o positivo, según los argumentos:

function(a, b){return a - b}

Cuando la función sort() compara dos valores, envía los valores a la función de comparación y ordena los valores según el valor devuelto (negativo, cero, positivo).

Si el resultado es negativo, a se ordena antes que b.

Si el resultado es positivo, b se ordena antes que a.

Si el resultado es 0, no se realizan cambios en el orden de clasificación de los dos valores.

Ejemplo:

La función de comparación compara todos los valores de la matriz, dos valores a la vez (a, b).

Al comparar 40 y 100, el método sort() llama a la función de comparación (40, 100).

La función calcula 40 - 100 (a - b) y, dado que el resultado es negativo (-60), la función de clasificación clasificará 40 como un valor inferior a 100.

Puede utilizar este fragmento de código para experimentar con la clasificación numérica y alfabética:

<button onclick="myFunction1()">Sort Alphabetically</button>
<button onclick="myFunction2()">Sort Numerically</button>

<p id="demo"></p>

<script>
const points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;

function myFunction1() {
  points.sort();
  document.getElementById("demo").innerHTML = points;
}

function myFunction2() {
  points.sort(function(a, b){return a - b});
  document.getElementById("demo").innerHTML = points;
}
</script>

Ver ejemplo


Ordenar una matriz en orden aleatorio

Ejemplo:

const points = [40, 100, 1, 5, 25, 10];
points.sort(function(){return 0.5 - Math.random()});

Ver ejemplo


El método Fisher Yates

El ejemplo anterior, array.sort(), no es exacto. Favorecerá a algunos números sobre otros.

El método correcto más popular se llama barajado de Fisher Yates y se introdujo en la ciencia de datos ya en 1938.

En JavaScript el método se puede traducir a esto:

Ejemplo:

const points = [40, 100, 1, 5, 25, 10];

for (let i = points.length -1; i > 0; i--) {
  let j = Math.floor(Math.random() * (i+1));
  let k = points[i];
  points[i] = points[j];
  points[j] = k;
}

Ver ejemplo


Encuentre el valor de matriz más bajo (o más alto)

No hay funciones integradas para encontrar el valor máximo o mínimo en una matriz.

Sin embargo, después de haber ordenado una matriz, puede utilizar el índice para obtener los valores más altos y más bajos.

Ordenación ascendente:

Ejemplo:

const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// now points[0] contains the lowest value
// and points[points.length-1] contains the highest value

Ver ejemplo

Ordenación descendente:

Ejemplo:

const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// now points[0] contains the highest value
// and points[points.length-1] contains the lowest value

Ver ejemplo

Ordenar una matriz completa es un método muy ineficiente si solo desea encontrar el valor más alto (o más bajo).


Usando Math.max() en una matriz

Puedes usar Math.max.apply para encontrar el número más alto en una matriz:

Ejemplo:

function myArrayMax(arr) {
  return Math.max.apply(null, arr);
}

Ver ejemplo

Math.max.apply(null, [1, 2, 3]) es equivalente a Math.max(1, 2, 3).


Usando Math.min() en una matriz

Puedes usar Math.min.apply para encontrar el número más bajo en una matriz:

Ejemplo:

function myArrayMin(arr) {
  return Math.min.apply(null, arr);
}

Ver ejemplo

Math.min.apply(null, [1, 2, 3]) es equivalente a Math.min(1, 2, 3).


Métodos mínimos y máximos

La solución más rápida es utilizar un método "casero".

Esta función recorre una matriz comparando cada valor con el valor más alto encontrado:

Ejemplo(encontrar el valor máximo):

function myArrayMax(arr) {
  let len = arr.length;
  let max = -Infinity;
  while (len--) {
    if (arr[len] > max) {
      max = arr[len];
    }
  }
  return max;
}

Ver ejemplo

Esta función recorre una matriz comparando cada valor con el valor más bajo encontrado:

Ejemplo(encontrar el valor mínimo):

function myArrayMin(arr) {
  let len = arr.length;
  let min = Infinity;
  while (len--) {
    if (arr[len] < min) {
      min = arr[len];
    }
  }
  return min;
}

Ver ejemplo


Ordenar matrices de objetos

Las matrices de JavaScript suelen contener objetos:

Ejemplo:

const cars = [
  {type:"Volvo", year:2016},
  {type:"Saab", year:2001},
  {type:"BMW", year:2010}
];

Incluso si los objetos tienen propiedades de diferentes tipos de datos, el método sort() se puede utilizar para ordenar la matriz.

La solución es escribir una función de comparación para comparar los valores de las propiedades:

Ejemplo

cars.sort(function(a, b){return a.year - b.year});

Ver ejemplo

Comparar propiedades de cadenas es un poco más complejo:

Ejemplo:

cars.sort(function(a, b){
  let x = a.type.toLowerCase();
  let y = b.type.toLowerCase();
  if (x < y) {return -1;}
  if (x > y) {return 1;}
  return 0;
});

Ver ejemplo


Matriz estable sort()

ES2019 revisó el método Array sort().

Antes de 2019, la especificación permitía algoritmos de clasificación inestables como QuickSort.

Después de ES2019, los navegadores deben utilizar un algoritmo de clasificación estable:

Al ordenar elementos según un valor, los elementos deben mantener su posición relativa con respecto a otros elementos con el mismo valor.

Ejemplo:

const myArr = [
  {name:"X00",price:100 },
  {name:"X01",price:100 },
  {name:"X02",price:100 },
  {name:"X03",price:100 },
  {name:"X04",price:110 },
  {name:"X05",price:110 },
  {name:"X06",price:110 },
  {name:"X07",price:110 }
];

Ver ejemplo

En el ejemplo anterior, al ordenar por precio, no se permite que el resultado salga con los nombres en otra posición relativa como esta:

X01 100
X03 100
X00 100
X03 100
X05 110
X04 110
X06 110
X07 110

Referencia completa de matrices JavaScript

Para obtener una referencia completa de Array, vaya a:

Referencia completa de matrices de JavaScript.

La referencia contiene descripciones y ejemplos de todas las propiedades y métodos de Array.


Traducido con 💚 desde W3Schools.com

Did you find this article valuable?

Support Santos Romero by becoming a sponsor. Any amount is appreciated!