2015-06-13 12 views
13

ho iniziato con:Perché non l'uguaglianza lavoro di controllo con le matrici

"1:2".split(':') == ["1","2"]; 
// false 

Poi provato:

[1,2] == [1,2]; 
// false 

e, in definitiva:

[] == []; 
// false 

Da allora ho scoperto che:

"1:2".split(':').toString() == [1,2].toString(); 
// true 

Quindi ho risolto il mio problema iniziale (tipo di) ma perché gli array non possono corrispondere l'un l'altro?

+2

Né '==', nè '' === fare elemento saggio confronto. Entrambi controllano se entrambi gli array sono la stessa cosa. – thefourtheye

+1

Questo perché gli array sono oggetti in JavaScript. Potresti dare un'occhiata a questo http://stackoverflow.com/questions/22395357/how-to-compare-two-arrays-are-equal-using-javascript-or-jquery – ankur

risposta

19

array Javascript sono oggetti e non si può semplicemente utilizzare l'operatore di uguaglianza == per capire se il contenuto di quegli oggetti è lo stesso. L'operatore di uguaglianza testerà solo se due oggetti sono in realtà esattamente la stessa istanza (ad esempio myObjVariable==myObjVariable, funziona anche per e undefined).

Se è necessario verificare se due array sono uguali, consiglio di attraversare entrambi gli array e verificare che tutti gli elementi abbiano lo stesso valore (e che i due array abbiano la stessa lunghezza).

Per quanto riguarda l'uguaglianza degli oggetti personalizzati, creerei invece una funzione specifica equals e la aggiungerei al prototipo della classe.

Considerando che alla fine convertito entrambi gli array ad un String e testato l'uguaglianza delle stringhe risultanti, si potrebbe considerare l'utilizzo di uno giorno una tecnica simile, ma più generico si trovare descritto in più di un paio di posti:

JSON.stringify(OBJ1) === JSON.stringify(OBJ2) 

Bene, non.

Mentre questo potrebbe funzionare se l'ordine delle proprietà sarà sempre lo stesso per quelle istanze di oggetto, questo lascia la porta aperta per bug estremamente cattivi che potrebbero essere difficili da rintracciare. Favorisci sempre un approccio più esplicito e scrivi semplicemente una funzione pulita e leggibile che verificherà l'uguaglianza controllando tutti i campi richiesti.

7

L'operatore == per Oggetti in Javascript controlla solo se gli oggetti sono lo stesso riferimento di oggetto effettivo, non se sono due oggetti separati che contengono gli stessi contenuti. Non esiste un operatore integrato per verificare se contengono gli stessi contenuti. Dovresti scrivere una funzione per fare questo tipo di confronto.

La conversione della stringa è un modo di confrontare due array purché gli elementi dell'array contengano solo valori primitivi (non altri oggetti). Se gli elementi dell'array potessero contenere altri elementi, dovresti assicurarti che anche quegli oggetti siano stati convertiti in stringhe rappresentative.

E, conversione in stringa non discernere tra un elemento di matrice che contiene "4" contro uno che contiene 4 poiché entrambi convertire "4" nella rappresentazione stringa.

2

In javascript ogni [] è un'istanza della classe window.Array. Quindi stai praticamente cercando di confrontare due oggetti diversi. Poiché l'array può avere qualsiasi no.e qualsiasi tipo di elementi inclusi Oggetti e Oggetti personalizzati e quegli array annidati possono avere ancora numerose proprietà e matrici e così via.

Diventa ambiguo quando si parla di confronto, non si sarà mai sicuri di cosa si vuole fare con quegli oggetti e le proprietà nidificate. Quindi quello che stai cercando di ottenere confrontando può essere fatto in tanti altri modi. Devi solo capire il modo giusto per il tuo caso.

0

Un modo è quello di rendere la propria funzione di controllo Array:

How to compare arrays in JavaScript?!

Un altro modo è convertire lo Array in un String con .join() e confrontare le stringhe. Quindi riconvertirli in Array s con .split().

0

L'uguaglianza per gli oggetti ti dirà se i due oggetti sono lo stesso.

var a = []; 
var b = a; 
a === b; // True, a and b refer to the same object 
[] === []; // False, two separate objects 

È necessario scorrere gli array per vedere se hanno gli stessi elementi.

See: How to check if two arrays are equal with JavaScript?

4

Gli array sono oggetti in JavaScript, che sono passaggio per riferimento. Ciò significa che quando inizializzo un array:

var array = [1, 2, 3]; 

Ho creato un riferimento a tale array in memoria. Se io poi dire: (., Anche se i valori sono uguali)

var otherArray = [1 2, 3]; 

array e otherArray hanno due punti diversi in memoria in modo che non sarà uguale a vicenda per testare il passaggio per riferimento si può giocare con le matrici di facendo:

var copyArray = array; 

in questo caso, copyArray fa riferimento lo stesso indirizzo di memoria, come matrice in modo:

copyArray === array; //will evaluate to true 
array.push(4); //copyArray will now have values [1, 2, 3, 4]; 
copyArray.push(5); //array will have values [1, 2, 3, 4, 5]; 
copyArray === array; //still true 

al fine di testare l'uguaglianza di valori in una matrice o un oggetto yo è necessario fare un "confronto approfondito" - per gli array questo attraverserà entrambi gli array per confrontare indice e valore per vedere se entrambi sono uguali - per gli oggetti attraverserà ogni chiave e si assicurerà che il valore sia lo stesso. Per ulteriori informazioni su confronti profondi è possibile controllare l'underscore.js fonte annotato:

http://underscorejs.org/docs/underscore.html

Problemi correlati