Newsgroup: it.comp.lang.javascript
Titolo: uguaglianza tra due oggetti

In JS quando due oggetti sono uguali?
Astraggo questa domanda filosofica da un problema pratico che mi sta 
crucciando in questi giorni (premetto che sono un programmatore molto 
amatoriale, della domenica insomma).
Sto utilizzando un accrocchio spaventoso, 
GreaseMonkey+JQuery+DataTables, che è un piccolo plugin che permette in 
maniera carina di automatizzare la creazione di tabelle, molto comodo.
Ho però un comportamento inaspettato, e cercando di analizzarlo 
guardando facendo un po' di debug all'interno del codice del plugin ho 
scoperto questo: il codice incriminato è il seguente
this.fnOpen = function( nTr, sHtml, sClass )
		{
			/* Find settings from table node */
			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
 
			/* the old open one if there is one */
			this.fnClose( nTr );
 
			var nNewRow = document.createElement("tr");
			var nNewCell = document.createElement("td");
			nNewRow.appendChild( nNewCell );
			nNewCell.className = sClass;
			nNewCell.colSpan = _fnVisbleColumns( oSettings );
			nNewCell.innerHTML = sHtml;
 
			/* If the nTr isn't on the page at the moment - then we don't insert 
at the moment */
			var nTrs = $('tbody tr', oSettings.nTable);
			if ( $.inArray(nTr, nTrs) != -1 )
			{
				$(nNewRow).insertAfter(nTr);
			}
 
			/* No point in storing the row if using server-side processing since 
the nParent will be
			 * nuked on a re-draw anyway
			 */
			if ( !oSettings.oFeatures.bServerSide )
			{
				oSettings.aoOpenRows.push( {
					"nTr": nNewRow,
					"nParent": nTr
				} );
			}
 
			return nNewRow;
		};
In sostanza la funzione riceve come parametri una riga (elemento tr) 
della tabella, una stringa html da iniettare e un nome di classe e 
inserisce una nuova riga nella tabella con l'html passato alla funzione 
dopo la riga passata come parametro.
Il problema si manifesta nella seguente porzione:
/* If the nTr isn't on the page at the moment - then we don't insert at 
the moment */
			var nTrs = $('tbody tr', oSettings.nTable);
			if ( $.inArray(nTr, nTrs) != -1 )
			{
				$(nNewRow).insertAfter(nTr);
			}
Il test $.inArray(nTr, nTrs) ritorna sempre -1 anche se io sono sicuro 
che nTr sia in quell'array. In altri script il funzionamento è corretto, 
quindi non è un errore "strutturale".
Detto questo, che metodi di debug ho per capire perchè lui ritiene che 
l'oggetto nTr non sia nell'array nTrs??
Chiedo scusa per la prolissità :)
Marco

Una piccola aggiunta:
Io per completezza ho esposto tutto il problema, ma ovviamente non mi 
attendo una soluzione completa da voi (magari :)).
Quello che cerco sono degli spunti sul miglior modo di operare per fare 
il debug di quella situazione, ovviamente utilizzo FF e Firebug

 l'oggetto nTr non sia nell'array nTrs??
Non sono in grado di darti una risposta mirata perché l'analisi
richiede tempo, posso contribuire condividendo l'esperienza nell'uso
del plugin datatable con il quale sto lavorando con soddisfazione
proprio in questi giorni.
Dovresti controllare che la struttura della tabella sia esattamente
quella indicata dalla pagina 
http://www.datatables.net/usage/
 in
particolarela presenza di thead e tbody, il plugin non funziona se la
struttura è anche leggermente diversa. Per iniettare dati all'interno
esistono diversi metodi uno dei quali richiede json anch'esso con una
struttura preordinata.

Oreste ha scritto:

Ti ringrazio per la risposta.
La tabella è costruita correttamente, infatti la tabella viene popolata 
bene. Quello che stavo cercando di fare, analogamente all'esempio 
riportato dal sito, è cliccando su una riga far comparire i dettagli 
della riga stessa, con la funzione fnOpen (il cui codice è quello che ho 
postato). Ma se l'esempio proposto mi funziona correttamente, inserito 
nel contesto del mio progetto mi dà il problema che descrivevo, anche se 
il codice è sostanzialmente identico :(
Marco

 In JS quando due oggetti sono uguali?
due oggetti sono ===uguali quando sono lo stesso oggetto.
Setta un breakpoint li' con il tuo debugger di fiducia e cinciona un po' :)