Intentar obtener el valor más alto y más bajo de una matriz que sé que contendrá solo enteros parece ser más difícil de lo que pensaba.
var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)
Esperaría que esto se notara 99, 104, 140000
. En cambio se nota 104, 140000, 99
. Entonces parece que el tipo está manejando los valores como cadenas.
¿Hay alguna manera de obtener la función de ordenación para realmente ordenar el valor entero?
javascript
arrays
sorting
numbers
peirix
fuente
fuente
NaN
. Sería bueno ver una respuesta altamente calificada con la que lidiarNaN
.Respuestas:
Por defecto, el método de clasificación ordena los elementos alfabéticamente. Para ordenar numéricamente solo agregue un nuevo método que maneje los ordenamientos numéricos (sortNumber, que se muestra a continuación):
En ES6, puede simplificar esto con las funciones de flecha:
Documentación:
Mozilla
Array.prototype.sort()
recomienda esta función de comparación para matrices que no contienen Infinity o NaN. (PorqueInf - Inf
es NaN, no 0).También ejemplos de ordenar objetos por clave.
fuente
numberArray.sort((a, b) => (a - b));
¡Hurra! Creo que esto está cerca de la forma original. Nota: compruebe si su motor JS admite funciones de flecha.Basándose en todas las respuestas anteriores, también se pueden hacer en una línea como esta:
fuente
var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });
. O más compacto, en ES6let arr = [140000, 104, 99].sort((a,b) => a-b);
function
yreturn
, pero en realidad no está utilizando el verdadero propósito de pasar de la función de flechathis
. Este código implica que estáthis
pasando algún contexto, pero no lo hay. Confuso para que otros desarrolladores lean su código, solo para guardar algunos caracteres. No dependa de los efectos secundarios: ¡codifique con un propósito!this
a la función, pero eso no es cierto. De hecho, se olvida de crear aythis
laarguments
variable que generalmente sobrescribe las variables principales. La única razón por la que puede usarthis
dentro de una función de flecha es el alcance léxico.array.sort realiza una ordenación lexicográfica por defecto, para una ordenación numérica, proporciona su propia función. Aquí hay un ejemplo simple:
También tenga en cuenta que la ordenación funciona "en el lugar", no hay necesidad de la asignación.
fuente
Esta respuesta es equivalente a algunas de las respuestas existentes, pero las funciones de flecha de ECMAScript 6 proporcionan una sintaxis mucho más compacta que nos permite definir una función de clasificación en línea sin sacrificar la legibilidad:
Actualmente es compatible con la mayoría de los navegadores .
fuente
objArray=objArray.sort((a,b)=>a.numProperty - b.numProperty);
y si la propiedad es una cadena, puede hacerlo:objArray=objArray.sort((a,b)=>a.strProperty.localeCompare(b.strProperty));
Dicho esto, esta pregunta específicamente pregunta sobre la ordenación de una matriz de enterosEstoy sorprendido de por qué todos recomiendan pasar una función de comparación
sort()
, ¡eso hace que la clasificación sea muy lenta!Para ordenar los números, simplemente cree cualquier TypedArray :
fuente
La razón por la cual la función de clasificación se comporta tan raro
De la documentación :
Si imprime los valores de punto unicode de la matriz, se aclarará.
Esto devuelve: "49, 49, 57".
Ahora, debido a que 140000 y 104 devolvieron los mismos valores (49), corta el primer índice y vuelve a verificar:
Si clasificamos esto, obtendremos:
entonces 104 viene antes de 140000.
Entonces el resultado final será:
104, 140000, 99
Conclusión:
sort()
ordena solo mirando el primer índice de los números.sort()
no le importa si un número entero es más grande que otro, compara el valor del unicode de los dígitos, y si hay dos valores unicode iguales, comprueba si hay un siguiente dígito y también lo compara.Para ordenar correctamente, debe pasar una función de comparación a
sort()
Me gusta explicada aquí .fuente
Estoy de acuerdo con aks, sin embargo, en lugar de usar
Deberías usar
fuente
>
y<
todavía compara a y b como cadenas.En el nuevo mundo ES6 es mucho más fácil hacer una especie
Eso es todo lo que necesitas :)
fuente
En JavaScript, el comportamiento predeterminado del método sort () es ordenar los valores en una matriz alfabéticamente.
Para ordenar por número, debe definir una función de clasificación numérica (que es muy fácil):
fuente
Array.prototype.sort () es el método de ir a la ordenación de matrices, pero hay algunos problemas que debemos tener en cuenta.
El orden de clasificación es, por defecto, lexicográfico y no numérico, independientemente de los tipos de valores en la matriz. Incluso si la matriz es todos los números, todos los valores se convertirán en cadenas y se ordenarán lexicográficamente.
Entonces, ¿deberíamos personalizar el método sort () y reverse () como se muestra a continuación.
URL referida
Para ordenar números dentro de la matriz
Para invertir números dentro de la matriz
URL referida
fuente
La pregunta ya ha sido respondida, la forma más corta es utilizar el
sort()
método. Pero si está buscando más formas de ordenar su conjunto de números, y también le encantan los ciclos, consulte lo siguienteTipo de inserción
Ascendente:
Descendente:
Tipo de selección:
Ascendente:
Descendente:
Que te diviertas
fuente
sort()
en un TypedArray como sugiere esta respuesta ? Ciertamente no serán más rápidos para matrices medianas a grandes porque estos son algoritmos O (n ^ 2).La función 'numéricamente' a continuación sirve para ordenar una matriz de números numéricamente en muchos casos cuando se proporciona como una función de devolución de llamada:
Pero en algunos casos raros, donde la matriz contiene números muy grandes y negativos, puede ocurrir un error de desbordamiento debido a que ab se vuelve más pequeño que el número más pequeño que JavaScript puede manejar.
Entonces, una mejor manera de escribir la función numérica es la siguiente:
fuente
DBL_MIN - DBL_MAX
), pero no es posible el subflujo. La cancelación catastrófica hace que el resultado sea impreciso, perdiendo la mayoría de sus "dígitos significativos", peroa-b
siempre será distinto de cero y tendrá el signo correcto para a! = B.para manejar undefined, null y NaN: Null se comporta como 0, NaN y undefined va al final.
fuente
Solo para una matriz normal de valores de elementos:
Para una matriz de objetos:
fuente
Mi forma favorita personal de esta función permite un parámetro para Ascendente o Descendente:
Uso tan simple como:
jsFiddle
O ejemplo de fragmento de código aquí!
.smartSort ('asc' | 'desc')
¡Ahora diviértete aún más con un método de clasificación que clasifica una matriz llena de múltiples elementos! Actualmente no cubre "asociativo" (también conocido como teclas de cadena), ¡pero cubre casi todo tipo de valor! No solo ordenará los valores múltiples
asc
o endesc
consecuencia, sino que también mantendrá una "posición" constante de "grupos" de valores. En otras palabras; las entradas siempre son primero, luego vienen las cadenas, luego las matrices (sí, ¡estoy haciendo esto multidimensional!), luego los objetos (sin filtro, elemento, fecha), y finalmente ¡indefinidos y nulos!"¿Por qué?" usted pregunta. ¡Por qué no!
¡Ahora viene en 2 sabores! El primero de los cuales requiere navegadores más nuevos, ya que se utiliza
Object.defineProperty
para agregar el método alArray.protoype
objeto. Esto permite la facilidad de natural de uso, tales como:myArray.smartSort('a')
. Si necesita implementar para navegadores más antiguos, o simplemente no le gusta modificar Objetos nativos, desplácese hacia abajo hasta la versión Solo método .jsFiddle Array.prototype.smartSort ('asc | desc')
¡El uso es simple! Primero haz una serie loca como:
¡Entonces simplemente ordénelo!
Solo método
¡Igual que el anterior, excepto como un método simple!
Utilizar:
Método jsFiddle smartSort (Array, "asc | desc")
fuente
Prueba este código:
HTML:
Código JavaScript:
fuente
Pruebe este código de la siguiente manera
fuente
fuente
Si bien no es obligatorio en JavaScript, si desea que devuelva estrictamente -1, 0 o 1 (similar a cómo funciona el operador de nave espacial en PHP), puede usarlo .
sort()
compareFunction
Math.sign()
Lo
compareFunction
siguiente devuelve estrictamente -1, 0 o 1:fuente
Esta es la solución ya propuesta y aceptada como método en el prototipo de matriz:
fuente
Como método de clasificación convierte los elementos de la matriz en una cadena. Entonces, a continuación también funciona bien con números decimales con elementos de matriz.
Y te da el resultado esperado.
fuente
Anular el método de clasificación.
fuente
La función de clasificación predeterminada es ordenar en orden de diccionario:
El anterior no es el caso que queremos para los números. Entonces, si tiene números enteros y la función de clasificación predeterminada no funciona (porque se clasifica en el orden del diccionario), entonces debe implementar su propia función:
Espero que tengas una pregunta en mente sobre cómo funciona. Aquí, cuando proporcionamos un método en función de clasificación, pasa dos números cada vez y si el número regresa
Siguiendo esto para todos los números, ordena la matriz de enteros.
Si está utilizando ES6, escriba una función de flecha:
fuente
Aquí está mi función de matriz de clasificación en la biblioteca de utilidades:
fuente
a-b
debería usarse en su lugar. (Puedes ponerte elegante y hacer unNumber(a>b)-0.5
, sin embargo, todavía no es un tipo estable).