¿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.

ramesh kumar
fuente
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
});
Salman A
fuente
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'));

Bharata
fuente
3

Aquí está el tipo, dependiendo de la longitud de una cadena con javascript como preguntaste:

[la solución del problema por clasificación de burbujas] [1]

[1]: http://jsfiddle.net/sssonline2/vcme3/2/enter code here

Shareef
fuente
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!

Nico
fuente
0

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

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


fuente
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
Rishabh Gupta
fuente
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'));
Hola
fuente
-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

Científico loco
fuente
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