No hace mucho, un problema muy mágico entró en el código de mi colega. El proceso aproximado es clasificar una matriz compuesta de objetos, donde el atributo A se usa para clasificar, y el atributo B es una condición preferida. Cuando B es igual a 1, no importa cuál sea el valor A, se clasifica al principio. Este es un problema muy simple. El problema es que usa Sort dos veces para implementar la clasificación esta vez, primero clasificando de acuerdo con el atributo de A, y luego la clasificación de acuerdo con el valor de B. El problema radica en la segunda clasificación.
Daremos por sentado que en la primera clasificación, la matriz se ha clasificado de gran a pequeño de acuerdo con los atributos de a. En la segunda vez, solo no necesitamos mover el orden de la matriz original (generalmente escrita como que regresa 0 o -1 en el método), y solo considere mencionar elementos con B igual a 1 al frente. Pero de hecho, esto está relacionado con el algoritmo de clasificación elegido por el idioma. El método de clasificación incorporado de JavaScript (y otros idiomas) utiliza una colección de varios algoritmos de clasificación, y a veces no puede garantizar que la posición de los mismos elementos siga siendo consistente.
A continuación se muestra un ejemplo que se encuentra en StackOverflow
La copia del código es la siguiente:
var arraytosort = [
{nombre: 'a', fuerza: 1}, {nombre: 'b', fuerza: 1}, {nombre: 'c', fuerza: 1}, {nombre: 'd', fuerza: 1},
{nombre: 'e', fuerza: 1}, {nombre: 'f', fuerza: 1}, {nombre: 'g', fuerza: 1}, {nombre: 'h', fuerza: 1},
{nombre: 'i', fuerza: 1}, {nombre: 'j', fuerza: 1}, {nombre: 'k', fuerza: 1}, {nombre: 'l', fuerza: 1},
{nombre: 'm', fuerza: 1}, {nombre: 'n', fuerza: 1}, {nombre: 'o', fuerza: 1}, {nombre: 'p', fuerza: 1},
{nombre: 'Q', Fuerza: 1}, {nombre: 'r', fuerza: 1}, {nombre: 's', fuerza: 1}, {nombre: 't', fuerza: 1}
];
arraytosort.sort (function (a, b) {
regreso B. Strength - A.strength;
});
arraytosort.ForEach (function (elemento) {
console.log (element.name);
});
Pensaríamos que el valor del último elemento aún es de A a T, pero el resultado real está fuera de servicio. Esto se debe a que el algoritmo de clasificación no retiene el orden de la matriz original, es decir, inestable.
Entonces debemos tratar de evitar esta situación. En el ejemplo de mi colega, fusionar la lógica de dos tipos en uno debería ser una forma factible. Si debe dividirse en múltiples tipos, entonces el orden de la matriz original se registra en los atributos de los elementos.