2013-03-28 10 views
5

in JavaScript, se ho un array di array, come la seguente:Utilizzando Javascript per ordinare un array di array numerici

X = [ [1,2,3,4], 
     [1,1,2,3], 
     [1,1,3], 
     [1,4], 
     [2,1,2], 
     [2,2] 
    ] 

Javascript smista il mio allineamento, confrontando prima voce prima, poi la seconda, e così via , in modo che X.sort() restituisce quanto segue:

[ [1,1,2,3], 
    [1,1,3], 
    [1,2,3,4], 
    [1,4], 
    [2,1,2], 
    [2,2] 
] 

che è quello che voglio. Il problema è che l'operatore di confronto per confrontare gli elementi negli array è lessicografico, così [10,2] < [2,2], e, per esempio,

[[10,2],[1,1,3],[2,2]].sort() -> [[1,1,3],[10,2],[2,2]] 

ho bisogno di ordinare numericamente, in modo che ho un array ordinato di [[1,1,3],[2,2],[10,2]].

Ho provato ad utilizzare una funzione di confronto di function(a,b){return (a-b) }, che avrebbe funzionato per l'ordinamento di una serie di numeri, ma questo non riesce a correttamente sorta mia matrice, che ha un senso (credo) perché [10,2] - [1,1,3] rendimenti NaN

Come faccio andare a ordinare una matrice di array numerici?

+5

Se si modifica la funzione di confronto per tenere conto del fatto che gli argomenti passati sono array, dovrebbe funzionare. http://jsfiddle.net/SYHr2/ – Rikonator

+0

@Rikonator Ottima soluzione, si potrebbe desiderare di postare che come risposta, sembra funzionare – Ian

+0

@Rikonator Fantastic! Mi dà la capacità di smistamento di cui ho bisogno con una funzione snella che non sovrascrive il metodo naturale .sort. Se lo scrivi come risposta, lo accetto. – ckersch

risposta

6

come ho detto nel mio commento, la funzione sort ha bisogno per tenere conto del In effetti, sta ricevendo array come argomenti e non valori normali. Quindi è necessario gestirli di conseguenza.

Suggerisco questo;

var compFunc = function (a, b) { 
    var len = a.length > b.length ? b.length : a.length; 

    for(var i=0; i<len; ++i) { 
     if(a[i] - b[i] !== 0) 
      return a[i] - b[i]; 
    } 

    return (a.length - b.length); 
}; 

Cerca dapprima le differenze nella lunghezza comune dei due array. Se la lunghezza comune è esattamente la stessa, viene ordinata in base alla lunghezza dell'array. Here's a working fiddle.

+1

'var len = Math.min (a.length, b.length);' Oltre a questo, a meno di stile, la tua funzione è esattamente come avrei dovuto codificarla. Grazie per non andare con la follia "un solo punto di uscita da una funzione"! – ErikE

1

Quando si esegue X.sort(), JavaScript è il confronto gli array individuali come stringhe. In pratica sta facendo a.toString().localeCompare(b.toString()). Questo non è quello che vuoi.

a.toString() è solitamente uguale a.join(',')

Cosa farei è confronta ciascun elemento di array utilizzando un ciclo.

Qualcosa di simile a questo:

X.sort(function(a,b){ 
    // Start off assuming values are equal 
    var ret = 0; 

    // Loop through a 
    for(var a_i = 0, a_length = a.length; a_i < a_length; a_i++){ 
     // If b is shorter than a, it comes first 
     if(typeof b[a_i] === 'undefined'){ 
      ret = 1; 
      break; 
     } 
     // if the element in a and b are *not* the same, then we can sort 
     else if(a[a_i] !== b[a_i]){ 
      ret = a[a_i] - b[a_i]; 
      break; 
     } 
    } 

    return ret; 
}); 
0

Hai bisogno di ordinare e confrontare tra le 2 matrici: http://jsfiddle.net/pXzB6/

var arr = [[10,2],[1,1,3],[2,2]]; 

arr.sort(function(a,b){ 
    for(var i=0;i<a.length;i++){ 
     var item_a = a[i]; 
     for(var j=0;j<b.length;b++){ 
      var item_b = b[j]; 
      if(item_a == item_b){ 
       continue; 
      } 
      else{ 
       return item_a > item_b; 
      } 
     } 
    } 

    if(a.length == b.length){ 
     return 0; 
    } 
    else{ 
     return a.length > b.length; 
    } 
}); 

console.log(arr); 
0

var points = [40, 100, 1, 5, 25, 10];

punti.sort (funzione (a, b) {return a-b});

allora il risultato è: 1,5,10,25,40,100

Questo è il modo più semplice credo, ha funzionato.

Problemi correlati