Array.prototype.sort()

El m茅todo sort() ordena los elementos de un arreglo (array) localmente y devuelve el arreglo ordenado. La ordenaci贸n no es necesariamente estable. El modo de ordenaci贸n por defecto responde a la posici贸n del valor del string de acuerdo a su valor Unicode.

La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si desea contribuir al proyecto de ejemplos interactivos, clone https://github.com/mdn/interactive-examples y env铆enos una solicitud de extracci贸n (pull request).

Sintaxis

arr.sort([compareFunction])

Par谩metros

compareFunction
Opcional. Especifica una funci贸n que define el modo de ordenamiento. Si se omite, el array es ordenado atendiendo a la posici贸n del valor Unicode de cada caracter, seg煤n la conversi贸n a string de cada elemento.
firstEl
El primer elemento a comparar.
secondEl
El segundo elemento a comparar.

Valor devuelto

El array ordenado.

Descripci贸n

Si no se provee compareFunction, los elementos son ordenados convirti茅ndolos a strings y comparando la posici贸n del valor Unicode de dichos strings. Por ejemplo, "Cherry" viene antes que "banana"  (porque las may煤sculas van antes que las min煤sculas en la codificaci贸n Unicode) . En un ordenamiento num茅rico, 9 est谩 antes que 80, pero dado que los n煤meros son convertidos a strings y ordenados seg煤n el valor Unicode, el resultado ser谩 "80" antes que "9".

var frutas = ['guindas', 'manzanas', 'bananas'];
frutas.sort(); // ['bananas', 'guindas', 'manzanas']

var puntos = [1, 10, 2, 21];
puntos.sort(); // [1, 10, 2, 21]
// Tenga en cuenta que 10 viene antes que 2
// porque '10' viene antes que '2' seg煤n la posici贸n del valor Unicode.

var cosas = ['word', 'Word', '1 Word', '2 Words'];
cosas.sort(); // ['1 Word', '2 Words', 'Word', 'word']
// En Unicode, los n煤meros vienen antes que las letras may煤sculas
// y estas vienen antes que las letras min煤sculas.

Si se provee compareFunction, los elementos del array son ordenados de acuerdo al valor que retorna dicha funci贸n de comparaci贸n. Siendo a y b dos elementos comparados, entonces:

  • Si compareFunction(a, b) es menor que 0, se sit煤a a en un indice menor que b. Es decir, a viene primero.
  • Si compareFunction(a, b) retorna 0, se deja a y b sin cambios entre ellos, pero ordenados con respecto a todos los elementos diferentes. Nota: el estandar ECMAscript no garantiza este comportamiento, por esto no todos los navegadores (p.ej.  Mozilla en versiones que datan hasta el 2003) respetan esto.
  • Si compareFunction(a, b) es mayor que 0, se sit煤a b en un indice menor que a.
  • compareFunction(a, b) siempre debe retornar el mismo valor dado un par especifico de elementos a y b como sus argumentos. Si se retornan resultados inconsistentes entonces el orden de ordenamiento es indefinido.

Entonces, la funci贸n de comparaci贸n tiene la siguiente forma:

function compare(a, b) {
  if (a es menor que b seg煤n criterio de ordenamiento) {
    return -1;
  }
  if (a es mayor que b seg煤n criterio de ordenamiento) {
    return 1;
  }
  // a debe ser igual b
  return 0;
}

Para comparar n煤meros en lugar de strings, la funci贸n de comparaci贸n puede simplemente restar b de a. La siguiente funci贸n ordena el array de modo ascendente:

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

El metodo sort puede ser usado convenientemente con function expressions (y closures):

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

Los objectos pueden ser ordenados por el valor de una de sus propiedades.

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];
items.sort(function (a, b) {
  if (a.name > b.name) {
    return 1;
  }
  if (a.name < b.name) {
    return -1;
  }
  // a must be equal to b
  return 0;
});

Ejemplos

Ordenando un array

Un array de elementos string, sin especificar una funci贸n de comparaci贸n:

var arr = [ 'a', 'b', 'Z', 'Aa', 'AA' ];
arr.sort();  //[ 'AA', 'Aa', 'Z', 'a', 'b' ]

Un array de elementos num茅ricos,  sin funci贸n de comparaci贸n:

var arr = [ 40, 1, 5, 200 ];
arr.sort();  //[ 1, 200, 40, 5 ]

Un array de elementos num茅ricos, usando una funci贸n de comparaci贸n:

var arr = [ 40, 1, 5, 200 ];
function comparar ( a, b ){ return a - b; }
arr.sort( comparar );  // [ 1, 5, 40, 200 ]

Lo mismo pero usando una funci贸n an贸nima normal:

var arr = [ 40, 1, 5, 200 ];
arr.sort(function(a,b){return a - b;});  // [ 1, 5, 40, 200 ]

Lo mismo escrito m谩s compacto mediante una funci贸n flecha:

var arr = [ 40, 1, 5, 200 ];
arr.sort((a,b)=>a-b);  // [ 1, 5, 40, 200 ]

Creando, mostrando, y ordenando un array

El siguiente ejemplo abunda en la idea de ordenar con y sin funci贸n de comparaci贸n. Adem谩s, ilustra una manera de mostrar un array una vez creado. El m茅todo join es usado para convertir el array en una cadena de texto que imprimir. Al no pasarle un argumento que indique el separador, usar谩 la coma por defecto para separar los elementos del array dentro de la cadena.

var arr = ['80', '9', '700', 40, 1, 5, 200];
function comparar(a, b) {
  return a - b;
}
console.log('original:', arr.join());
console.log('ordenado sin funci贸n:', arr.sort());
console.log('ordenado con funci贸n:', arr.sort(comparar));

El ejemplo produce el siguiente resultado. Como muestra la salida, cuando una funci贸n de comparaci贸n es usada, los n煤meros se ordenan correctamente, sean estos valores num茅ricos o strings num茅ricos.

original: 80,9,700,40,1,5,200
ordenado sin funci贸n: 1,200,40,5,700,80,9
ordenado con funci贸n: 1,5,9,40,80,200,700

Ordenando caracteres no ASCII

Para ordenar strings con characters no ASCII, i.e. strings con caracteres con acento (e, 茅, 猫, a, 盲, etc.), strings de lenguajes diferentes al ingl茅s: use String.localeCompare. Esta funci贸n puede comparar esos caracteres para que aparezcan en el orden correcto.

var items = ['r茅serv茅', 'premier', 'clich茅', 'communiqu茅', 'caf茅', 'adieu'];
items.sort(function (a, b) {
  return a.localeCompare(b);
});

// items is ['adieu', 'caf茅', 'clich茅', 'communiqu茅', 'premier', 'r茅serv茅']

Ordenando con map

La compareFunction puede ser invocada m煤ltiples veces por elemento dentro del array. Dependiendo de la naturaleza de compareFunction, este puede resultar en una alta penalizaci贸n de rendimiento. Cuanto m谩s trabajo hace una compareFunction y m谩s elementos hay para ordenar, resulta m谩s recomendable usar una funci贸n map para ordenar. La idea es recorrer el array una sola vez para extraer los valores usados para ordenar en un array temporal, ordenar el array temporal y luego recorrer el array para lograr el orden correcto.

// el array a ordenar
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];

// array temporal contiene objetos con posici贸n y valor de ordenamiento
var mapped = list.map(function(el, i) {
  return { index: i, value: el.toLowerCase() };
})

// ordenando el array mapeado que contiene los valores reducidos
mapped.sort(function(a, b) {
  if (a.value > b.value) {
    return 1;
  }
  if (a.value < b.value) {
    return -1;
  }
  return 0;
});

// contenedor para el orden resultante
var result = mapped.map(function(el){
  return list[el.index];
});

Especificaciones

Especificaci贸n Estado Comentario
ECMAScript 1st Edition Standard Definici贸帽 inicial.
ECMAScript 5.1 (ECMA-262)
La definici贸n de 'Array.prototype.sort' en esta especificaci贸n.
Standard
ECMAScript 2015 (6th Edition, ECMA-262)
La definici贸n de 'Array.prototype.sort' en esta especificaci贸n.
Standard

Compatibilidad en navegadores

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help! (en-US)
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 1.0 1.0 (1.7 o anterior) 5.5 (Yes) (Yes)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Compatibilidad en navegadores

La tabla de compatibilidad en esta p谩gina es generada por una data estructurada. Si deseas contribuir a la data, por favor entra a https://github.com/mdn/browser-compat-data y env铆anos un pull request.

Ver tambi茅n