Table of contents
- Ordenar una matriz
- Invertir una matriz
- Orden numérico
- La función de comparación
- Ordenar una matriz en orden aleatorio
- El método Fisher Yates
- Encuentre el valor de matriz más bajo (o más alto)
- Usando Math.max() en una matriz
- Usando Math.min() en una matriz
- Métodos mínimos y máximos
- Ordenar matrices de objetos
- Matriz estable sort()
- Referencia completa de matrices JavaScript
Ordenar una matriz
El método sort()
ordena una matriz alfabéticamente:
Ejemplo:
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
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();
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});
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});
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>
Ordenar una matriz en orden aleatorio
Ejemplo:
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(){return 0.5 - Math.random()});
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;
}
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
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
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);
}
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);
}
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;
}
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;
}
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});
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;
});
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 }
];
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