2011-11-30 14 views
19

Sto provando a confrontare due array in javascript.javascript confronto array sorprendente

Quello che mi piace è:

un < b ⇔ ∃ i ≥ 0 S.T. a [i] < b [i] e & forall; 0 ≤ j < i, a [j] = b [j]

Così matrici di lavoro numeri non negativi come desiderate:

firebug> [0,1,2,3,4] < [1,0,0] 
true 

e confrontando i numeri negativi con zero funziona come previsto:

firebug> [-1, 1] < [0, 0] 
true 

Ma confrontando i numeri negativi con i numeri negativi è ... stravaganti:

firebug> [-2] < [-1] 
false 
firebug> -2 < -1 
true 

Cosa sta succedendo qui, quindi posso correggere il mio intuito per quale comparazione di array significa in javascript?

+0

Vedi anche [Come sono le matrici confrontati in JavaScript] (http: //stackoverflow.com/q/16566772/1048572) per una spiegazione del comportamento e [Funzione di confronto a tre vie per Array in Javascript] (http://stackoverflow.com/q/23881838/1048572) per una soluzione – Bergi

risposta

21

La matrice viene convertito a una stringa, che scende a .join(), che a sua volta unisce gli elementi con una virgola (,) come delimitatore.

"-1,1" < "0,0" === true 

perché il codice carattere di - (45) è minore del codice carattere di 0 (48).

D'altra parte,

"-2" < "-1" === false 

perché il secondo codici di carattere vengono confrontati (i primi sono entrambi -, in modo che non dà ancora un risultato), e il codice di carattere per 2 (50) è più grande rispetto al codice carattere di 1 (49), quindi questo produce false.

Si tratta di un ordinamento lessografico (cioè per codici di caratteri) e non di uno numerico, anche se gli elementi sono numeri (a causa della coercizione di stringa).

Non è consigliabile confrontare sostanzialmente gli array. È implicitamente definito come confronto tra stringhe, ma ciò può dare risultati sorprendenti.

+0

quindi , '+ [- 2] - + [- 1];' dovrebbe fare il trucco. – jAndy

+1

@jAndy: Lo farebbe, ma di nuovo funziona bene solo per gli array a un elemento. '-2 - 1' sarebbe un po 'più chiaro ... – pimvdb

6

Non esiste una comparazione di array JavaScript in alcuna forma simile a quella che descrivi.

Quello che succede in tutti i casi è che i tuoi array vengono convertiti prima in stringhe unendo i loro contenuti insieme. Pertanto, la stringa "-2" è non inferiore alla stringa "-1", perché il carattere "2" viene dopo "1" nel set di caratteri. Allo stesso modo, "-1,1" è inferiore a "0,0" perché il carattere "-" viene prima delle cifre.

Si può vedere di persona che in tutti i casi vostri confronti:

array1 < array2 

ottenere esattamente gli stessi risultati:

("" + array1) < ("" + array2) 

o:

array1.join(",") < array2.join(",") 
1

non riuscivo a trovare una risposta su come confrontare in realtà gli array in Javascript e ottenere "attesi" i risultati, ecco il codice

compareArrays = function(a, b) { 
    var elA, elB, i, len; 
    for (i = 0, len = Math.min(a.length, b.length); i < len; i++) {    
    elA = a[i], elB = b[i]; 
    if (elA > elB) return 1; 
    if (elA < elB) return -1; 
    } 
    return b.length - a.length; 
}; 

console.log(compareArrays([-2], [-1])) # -1 
console.log(compareArrays([], [])) # 0 
console.log(compareArrays([null], [undefined])) # 0 
console.log(compareArrays([1, 2, 3], [1, 2, 3, 4])) # 1 
console.log(compareArrays([0, 2], [0, 1])) # 1 
console.log(compareArrays([1], [NaN])) # 0 
console.log(compareArrays([NaN], [1])) # 0