es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una mejor manera de ordenar una matriz 2D dos veces según dos criterios diferentes?

Tengo un array: arr = [[3,2],[1,2],[2,1]] y me gustaría ordenarlo como: arr = [[1,2],[3,2],[2,1]].
Lo que estoy haciendo es ordenando primero por subArr[1] y en caso de que dos elementos tengan la misma subArr[1], entonces ordenar solo esos dos elementos por su subArr[0].

Esto es lo que hice, lo cual creo que es estúpido porque invoca el método .sort() dos veces.

function sortArr(array) {
  let arr = array;
  arr.sort((a, b) => {
    return b[1] - a[1];
  });
  arr.sort(function (a, b) {
    if (a[1] == b[1]) {
      return a[0] - b[0];
    }
    return b[1] - a[1];
  });
  return arr;
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay una forma más eficiente de ordenar el array. Puedes encadenar las condiciones de clasificación en una sola llamada al método sort() usando un array de condiciones. Aquí tienes una implementación:

    function sortArr(array) {
      let arr = array;
      arr.sort((a, b) => {
        return a[1] !== b[1] ? a[1] - b[1] : a[0] - b[0];
      });
      return arr;
    }
    

    Esta implementación ordena el array por subArr[1] primero. Si dos elementos tienen el mismo valor de subArr[1], entonces ordena esos dos elementos por subArr[0]. Ten en cuenta que a[1] !== b[1] es una forma abreviada de verificar si a[1] no es igual a b[1]. El operador ternario a[1] !== b[1] ? a[1] - b[1] : a[0] - b[0] compara la primera condición a[1] !== b[1]. Si la condición es verdadera, devuelve la diferencia entre a[1] y b[1], lo que indica cómo se deben ordenar los dos elementos. De lo contrario, devuelve la diferencia entre a[0] y b[0], que se utiliza para desempatar.

Comments are closed.