¿Cómo ordenar una matriz según la longitud de cada elemento?


95

Tengo una matriz como esta:

arr = []
arr[0] = "ab"
arr[1] = "abcdefgh"
arr[2] = "abcd"

Después de ordenar, la matriz de salida debe ser:

arr[0] = "abcdefgh"
arr[1] = "abcd"
arr[2] = "ab"  

Quiero decir, quiero en orden descendente de la longitud de cada elemento.


1
sortes bastante sencillo, ¿dónde tienes dificultades?
mu es demasiado corto

4
@muistooshort bien por defecto sort () ordena las cadenas alfabéticamente, estaba buscando la clasificación string.length como se puede ver en la respuesta elegida :)
jave.web

Respuestas:


231

Puede usar el Array.sortmétodo para ordenar la matriz. Una función de clasificación que considera la longitud de la cadena como criterio de clasificación se puede utilizar de la siguiente manera:

arr.sort(function(a, b){
  // ASC  -> a.length - b.length
  // DESC -> b.length - a.length
  return b.length - a.length;
});

Nota: ["a", "b", "c"]no se garantiza el retorno de la clasificación por longitud de cadena ["a", "b", "c"]. Según las especificaciones :

El género no es necesariamente estable (es decir, los elementos que se comparan iguales no necesariamente permanecen en su orden original).

Si el objetivo es ordenar por longitud, entonces por orden de diccionario debe especificar criterios adicionales:

["c", "a", "b"].sort(function(a, b) {
  return a.length - b.length || // sort by length, if equal then
         a.localeCompare(b);    // sort by dictionary order
});

Agregaría que esto ordena la matriz disminuyendo la longitud de los elementos.
davidhq

aha está en el comentario :) no lo vi al principio
davidhq

Solo para agregar una información. Este fragmento no funcionará en todos los casos.
Arunkumar Srisailapathi

Prueba con arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], fallará
Arunkumar Srisailapathi

15
El camino ES6arr.sort((a, b) => b.length - a.length)
Fergal

4

Podemos usar el método Array.sort para ordenar esta matriz.

Solución ES5

var array = ["ab", "abcdefgh", "abcd"];

array.sort(function(a, b){return b.length - a.length});

console.log(JSON.stringify(array, null, '\t'));

Para orden de clasificación ascendente :a.length - b.length

Para orden de clasificación descendente :b.length - a.length

Solución ES6

Atención: no todos los navegadores pueden entender el código ES6.

En ES6 podemos usar expresiones de función de flecha .

let array = ["ab", "abcdefgh", "abcd"];

array.sort((a, b) => b.length - a.length);

console.log(JSON.stringify(array, null, '\t'));



0

Según la respuesta de Salman, escribí una pequeña función para encapsularlo:

function sortArrayByLength(arr, ascYN) {
        arr.sort(function (a, b) {           // sort array by length of text
            if (ascYN) return a.length - b.length;              // ASC -> a - b
            else return b.length - a.length;                    // DESC -> b - a
        });
    }

entonces solo llámalo con

sortArrayByLength( myArray, true );

Tenga en cuenta que, desafortunadamente, las funciones no pueden / no deben agregarse al prototipo Array, como se explica en esta página .

Además, modificó la matriz pasada como parámetro y no devuelve nada. Esto forzaría la duplicación de la matriz y no sería bueno para matrices grandes. Si alguien tiene una idea mejor, ¡por favor comente!


0

Adapté la respuesta de @ shareef para que fuera concisa. Yo suelo,

.sort(function(arg1, arg2) { return arg1.length - arg2.length })


esto ordenaría de menor a mayor duración
Miguel

0
#created a sorting function to sort by length of elements of list
def sort_len(a):
    num = len(a)
    d = {}
    i = 0
    while i<num:
        d[i] = len(a[i])
        i += 1
    b = list(d.values())
    b.sort()
    c = []
    for i in b:
        for j in range(num):
            if j in list(d.keys()):
                if d[j] == i:
                    c.append(a[j])
                    d.pop(j)
    return c

1
Publicar el código solo no ayudará. Da una breve descripción de lo que hace tu código.
coderpc

-1

Este código debería hacer el truco:

var array = ["ab", "abcdefgh", "abcd"];

array.sort(function(a, b){return b.length - a.length});

console.log(JSON.stringify(array, null, '\t'));

-3
<script>
         arr = []
         arr[0] = "ab"
         arr[1] = "abcdefgh"
         arr[2] = "sdfds"
         arr.sort(function(a,b){
            return a.length<b.length
         })
         document.write(arr)

</script>

La función anónima que pasa para ordenar le dice cómo ordenar la matriz dada. Espero que esto ayude. Sé que esto es confuso, pero puede decirle a la función de ordenación cómo ordenar los elementos de la matriz pasándole una función como parámetro que dice es que hacer


5
¿Qué se supone que devuelve la función de comparación de clasificación? Aquí hay una pista: no es un booleano.
mu es demasiado corto
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.