Newsgroup: it.comp.lang.javascript
Titolo: matrici non identiche, perché?

var M1=[33,38,47];
var M2=[];
M2.push(33);
M2.push(38);
M2.push(47);
alert((M1==M2));
 
perchï¿œ M1 e M2 non sono uguali? Come faccio a obbligare M1 a essere 
uguale a M2?
 

 uguale a M2?
 
Non puoi. Sono due istanze diverse. Cosï¿œ come:
 
    var x = new Object();
    var y = new Object();
 
    x == y // false
 
L'unica cosa che puoi fare, ï¿œ verificare che abbiano lo stesso
contenuto. Se sono array che contengono numeri, puoi anche banalmente
verificare la stringa risultante dal join:
 
    M1.join() === M2.join()
 

      M1.join() === M2.join()
 
Ecco, servito. Grazie di avere capito cosa mi occorreva.
 


Come ho detto, nota che questa cosa funziona unicamente in un caso come
quello da te esposto. Ma fallisce in qualsiasi altro caso. Ad esempio:
 
    [2, 10, 3, 5].join() == [[2, 10], [3, 5]].join()
 
Dove i contenuti sono palesemente diversi: il primo array contiene
quattro elementi numerici, mentre il secondo una coppia di array che a
loro volta contengono una coppia di numeri.
 
Per non parlare poi di stringhe, oggetti, e quant'altro.
 

Il 21/02/2013 16:12, ZER0 ha scritto:
 > L'unica cosa che puoi fare, è verificare che abbiano lo stesso
 > contenuto. Se sono array che contengono numeri, puoi anche banalmente
 > verificare la stringa risultante dal join:
 >
 >      M1.join() === M2.join()
 
Butto lì un'alternativa, a memoria (lacunosa ;) ).
Ho riscontrato anch'io che l'operatore di eguaglianza non funziona per 
gli array, ma gli operatori maggiore e minore sì.
Quindi con un !(M1>M2 || M2>M1) si ottiene un risultato corretto.
 
Con tutte le debite considerazioni sui motivi del comportamento e in 
casi meno banali, come quelli che hai citato nell'altro post.
 
Ciao,
Pablo

 Quindi con un !(M1>M2 || M2>M1) si ottiene un risultato corretto.
 
Si ritorna al solito discorso di cui sopra:
 
    var M1 = [1, 2];
    var M2 = [1, [2]];
 
    console.log(!(M1>M2 || M2>M1)) // true
 
Questo perché i comparison operator che coinvolgono questo genere di
operazioni (quindi non uguaglianza o disuguaglianza) eseguono il
`toString`/`valueOf` per capire "chi è maggiore di cosa", e nel caso
degli array è esattamente come invocare il `join`. Avrei potuto anche
suggerire di fare:
 
    M1.toString() == M2.toString()
 
Ma semplicemente `join` era piú corto. :) Rispetto al tuo esempio,
inoltre, lo fa una volta sola mentre nel tuo codice la conversione a
stringa viene applicata due volte (vedi l'or) nel caso in cui la prima
condizione risulti falsa.
 
Onestamente non mi sentirei di suggerire un approccio del genere, che
appunto utilizza implicitamente la conversione a stringa ma senza
renderla appunto "esplicita", e quindi si va a perdere di leggibilità.

 renderla appunto "esplicita", e quindi si va a perdere di leggibilità.
 
Ci mancherebbe, sono assolutamente d'accordo! :)
Preferisco anch'io scrivere il codice in modo più esplicito e chiaro.
Come dicevo la mia era solo una proposta alternativa, buttata lì in base 
a un vago ricordo, solo a scopo "di studio" ;)
 

 Che mi sono perso? :)
 
Leggi su. :) Come detto, viene applicata nel caso in cui la prima
condizione risulti falsa, ovvero se M1 e M2 sono uguali oppure la
versione stringa di M2 è maggiore di M1: che sono due casi su tre. :)
 
 

 volta sola per coppia.
 
Della serie: quando si è troppo stanchi, non parlare.
Avrei fatto meglio a stare zitto, mi sarei evitato la domanda 
palesemente sciocca :D
 
Piuttosto, visto che l'argomento mi sembra interessante, tu usi qualche 
libreria specifica per lavorare con matrici?
Ho visto che c'è Sylvester e mi sembra discreta, almeno a livello di codice.
Per capirci: uno strumento equiparabile a NumPy in Python o JAMA in Java...
 
Sarei sempre più tentato dall'idea di usare JavaScript come linguaggio 
"completo" e non solo per il "semplice" scripting del browser ma non 
riesco a farmi un'idea della disponibilità di strumenti e librerie.
Ho fatto qualche prova (con Node.js e alcune implementazioni di 
CommonJS, tipo RingoJS) e mi sembra di vedere ancora parecchie aree "non 
coperte".
Per ora lavoro bene con Rhino ma mi piacerebbe avere del codice 
"riciclabile" fuori dall'ambito Java.
 
Forse sto andando OT rispetto alla domanda dell'OP...
 
Grazie!
 

 Forse sto andando OT rispetto alla domanda dell'OP...
 
Magari sí, ma non credo nessuno se ne avrà a male. ;)