Pregunta Cómo ordenar una matriz de enteros correctamente


Tratar de 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 muestre 99, 104, 140000. En cambio, muestra 104, 140000, 99. Entonces parece que el género maneja los valores como cadenas.

¿Hay alguna manera de hacer que la función de clasificación realmente clasifique en un valor entero?


512
2018-06-30 10:43


origen


Respuestas:


Por defecto, el método de clasificación ordena los elementos alfabéticamente. Para ordenar numéricamente simplemente agregue un nuevo método que maneja géneros numéricos (sortNumber, se muestra a continuación) -

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

var numArray = [140000, 104, 99];
numArray.sort(sortNumber);
alert(numArray.join(","));

EDITAR: utilizando las funciones de flecha ES6:

numArray.sort((a, b) => a - b); // For ascending sort
numArray.sort((a, b) => b - a); // For descending sort

729
2018-06-30 10:47



Solo basándonos en todas las respuestas anteriores, también se pueden hacer en una línea como esta:

var numArray = [140000, 104, 99];

// ES5
numArray = numArray.sort(function (a, b) {  return a - b;  });

// ES2015
numArray = numArray.sort((a, b) => a - b);

//outputs: 99, 104, 140000

132
2018-02-06 06:07



array.sort realiza un tipo lexicográfico de forma predeterminada, para un tipo numérico, proporciona tu propia función. Aquí hay un ejemplo simple:

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

numArray.sort(compareNumbers);

También tenga en cuenta que el género funciona "en su lugar", no hay necesidad de la asignación.


63
2018-06-30 10:47



Esta respuesta es equivalente a algunas de las respuestas existentes, pero ECMAScript 6 funciones de flecha proporcionan una sintaxis mucho más compacta que nos permite definir una función de ordenación en línea sin sacrificar la legibilidad:

numArray = numArray.sort((a, b) => a - b);

Es compatible con la mayoría de los navegadores de hoy.


32
2018-02-03 20:07



Estoy de acuerdo con aks, sin embargo, en lugar de usar

return a - b;

Deberías usar

return a > b ? 1 : a < b ? -1 : 0;

16
2018-06-30 10:48



En JavaScript, el comportamiento predeterminado del método sort () es ordenar alfabéticamente los valores en una matriz.

Para ordenar por número, debe definir una función de clasificación numérica (que es muy fácil):

...
function sortNumber(a, b)
{
  return a - b;
}

numArray = numArray.sort(sortNumber);

10
2018-03-02 07:53



Array.prototype.sort () es el método de ir a la ordenación de matrices, pero hay un par de cuestiones 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 contiene todos los números, todos los valores se convertirán en cadena y se clasificarán lexicográficamente.

Entonces, ¿deberíamos personalizar el método sort () y reverse () como a continuación?

URL referida

Para clasificar los números dentro de la matriz

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

Para invertir los números dentro de la matriz

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

URL referida


8
2018-05-26 07:07



La razón por la cual la función de clasificación se comporta de manera tan extraña

Desde el documentación:

[...] la matriz se ordena de acuerdo con el punto de código Unicode de cada personaje   valor, de acuerdo con la conversión de cadena de cada elemento.

Si imprime el valores de punto unicode de la matriz, entonces se aclarará.

console.log("140000".charCodeAt(0));
console.log("104".charCodeAt(0));
console.log("99".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

Esto devuelve: "49, 49, 57".

49 (unicode value of first number at 140000)
49 (unicode value of first number at 104)
57 (unicode value of first number at 99)

Ahora, debido a que 140000 y 104 devolvieron los mismos valores (49) corta el primer índice y comprueba de nuevo:

console.log("40000".charCodeAt(0));
console.log("04".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

52 (unicode value of first number at 40000)
40 (unicode value of first number at 04)

Si ordenamos esto, obtendremos:

40 (unicode value of first number at 04)
52 (unicode value of first number at 40000)

entonces 104 viene antes de 140000.

Entonces el resultado final será:

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

104, 140000, 99

Conclusión:

sort() ordena por solo mirar el primer índice de los números. sort() no 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, entonces verifica si hay un próximo dígito y lo compara también.

Para ordenar correctamente, debe pasar una función de comparación a sort()como explicado aquí.


5
2018-06-26 18:34



La pregunta ya ha sido respondida, la forma más corta es usar sort() método. Pero si está buscando más formas de ordenar su matriz de números, y también le gustan los ciclos, verifique lo siguiente

Tipo de inserción

Ascendente:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] > target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

Descendente:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] < target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

Tipo de selección:

Ascendente:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
    var min = i;
    for (var j = i + 1; j < numArray.length; j++) {
        if (numArray[j] < numArray[min]) {
            min = j;
        }
    }
    if (min != i) {
        var target = numArray[i];
        numArray[i] = numArray[min];
        numArray[min] = target;
    }
}
console.log(numArray);

Descendente:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
    var min = i;
    for (var j = i + 1; j < numArray.length; j++) {
        if (numArray[j] > numArray[min]) {
            min = j;
        }
    }
    if (min != i) {
        var target = numArray[i];
        numArray[i] = numArray[min];
        numArray[min] = target;
    }
}
console.log(numArray);

Que te diviertas


4
2018-02-07 11:04



Para una matriz normal de elementos, solo valores:

function sortArrayOfElements(arrayToSort) {
    function compareElements(a, b) {
        if (a < b)
            return -1;
        if (a > b)
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareElements);
}

e.g. 1:
var array1 = [1,2,545,676,64,2,24]
**output : [1, 2, 2, 24, 64, 545, 676]**

var array2 = ["v","a",545,676,64,2,"24"]
**output: ["a", "v", 2, "24", 64, 545, 676]**

Para una variedad de objetos:

function sortArrayOfObjects(arrayToSort, key) {
    function compareObjects(a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareObjects);
}

e.g. 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}]

**output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]**

2
2018-02-07 10:58