Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Problema array multipli

  1. #1

    Problema array multipli

    In questo esempio riempio un array multidimensionale con nomi:

    nome[1,1]="mario";
    nome[1,2]="franco";
    nome[2,1]="tom";
    nome[2,2]="mary";

    Ora provo a richiamare uno dei valori, precisamente "mario":

    window.alert("nome italiano selezionato: "+nome[1,1]);

    ...mi restituisce "Tom" anzichè "mario". Qualcuno sa dirmi perchè??
    Where there is a will, there is a way

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    3,651
    La sintassi è sbagliata... o meglio, non ci sono errori sintattici ma il modo con cui vuoi definire un array multidimensionale non è quello. Non devi usare la virgola per definire i vari indici degli array annidati, ma devi inserirli ognuno tra le proprie parentesi quadre. Nella tua precedente discussione (anche se chiedevi una diversa cosa) forse ti sei avvicinato di più a livello di sintassi.

    Ci sono comunque varie cose che forse è meglio chiarire.

    Prima cosa:
    in JavaScript l'indice degli array è a base 0 (zero). Se la tua variabile nome è definita come classe di un oggetto array, il primo elemento sarà nome[0]. Chiaramente questo non pregiudica il fatto che tu abbia valorizzato gli elementi a partire dall'indice 1, ma ovviamente avrai un primo elemento praticamente vuoto.

    Puoi verificare eseguendo qualche log.
    In fase di debug e di verifica, consiglio di utilizzare console.log() anziché alert(). Dalla console del tuo browser (accessibile premendo F12 e selezionando la scheda "console") puoi quindi vedere cosa ti viene restituito. Questo ti permette anche di "esplorare" eventuali oggetti strutturati, come nel caso di un array, dove puoi vederene le sue proprietà attraverso gli strumenti di ispezione, diversamente dall'alert con cui invece viene restituito del semplice testo.

    Esempio:
    codice:
    var nome = new Array();
    
    nome[1]="pippo";
    nome[2]="pluto";
    
    console.log(nome);
    Nella console sarà mostrata una cosa di questo tipo:
    [object Array]: [undefined, "pippo", "pluto"]

    Ciò che viene mostrato in console può variare a seconda del browser usato ma il discorso non cambia. Il tuo array avrà una lunghezza di 3 elementi dove il primo (con indice 0) risulterà non definito.

    Seconda cosa:
    Per restituire o impostare il valore di un elemento dell'array puoi usare vari metodi. Nel tuo caso stai utilizzando le parentesi quadre [] per specificare l'indice. Tra le parentesi deve essere messo un singolo valore numerico (o un'espressione che restituisca un valore numerico). Tu invece hai inserito un'espressione di questo genere - (1,1) - pensando erroneamente di definire un array multidimensionale. Cosa sta avvenendo invece nel tuo script e perché viene restituito quel valore da te inatteso?

    E' presto detto. Prova a fare un semplice log con questa espressione e vedi cosa viene restituito:
    codice:
    console.log( (1,1) ); // restituisce: 1
    console.log( (1,2) ); // restituisce: 2
    console.log( (2,1) ); // restituisce: 1
    console.log( (2,2) ); // restituisce: 2
    In una normale espressione, se usi la virgola per separare dei valori (che siano numeri o altro), viene restituito solo l'ultimo valore specificato.

    Esempio:
    codice:
    console.log( (1,2,3,"stella") ); // restituisce l'ultimo valore: "stella"
    Occhio, parlo di valore restituito da un'espressione e non di altri casi come ad esempio la definizione di argomenti in una funzione, in cui appunto si utilizza la virgola come separatore. Anche per questo motivo in questo caso è necessario racchiudere l'espressione tra parentesi, perché altrimenti ci sarebbe un conflitto con la definizione degli argomenti che possono essere passati alla funzione console.log(). Ma il discorso non cambia; all'interno delle parentesi quadre nel tuo script, scrivendo - nome[1,1] -, stai definendo una espressione che restituisce un valore. Equivale a scrivere - nome[(1,1)] -, dove l'espressione viene risolta dall'interprete JavaScript il quale restituisce il semplice valore 1.

    Nello specifico, scrivere nome[1,1] è lo stesso che scrivere nome[1].
    Ma anche scrivere nome[2,1] è lo stesso che scrivere nome[1].

    Il tuo script si traduce quindi in una cosa di questo tipo:
    codice:
    nome[1]="mario";
    nome[2]="franco";
    nome[1]="tom";
    nome[2]="mary";
    con la conclusione che tu stai semplicemente sovrascrivendo quei valori ("mario" e "franco") con i nuovi valori ("tom" e "mary") rispettivamente per gli elementi con indice 1 e 2 dell'array nome.

    Cosa succede quando viene eseguito questo?
    codice:
    window.alert("nome italiano selezionato: "+nome[1,1]);
    Che l'interprete JavaScript, risolvendo l'espressione, lo traduce in questo:
    codice:
    window.alert("nome italiano selezionato: "+nome[1]);
    dove nome[1] non è altro che "tom", cioè l'ultimo valore definito per quell'elemento.

    Terza cosa:
    Per definire un array, così come per un array di array, esistono vari modi... ma non quello che hai usato tu.
    Vedi documentazione https://developer.mozilla.org/it/doc...ed_collections

    Per definire il tuo array bidimensionale potresti usare una cosa del genere:
    codice:
    var nome = [
       ["mario", "franco"],
       ["tom", "mary"]
    ];
    per cui il tuo alert sarà:
    codice:
    window.alert("nome italiano selezionato: "+nome[0][0]);
    dove sarà restituito giustamente il valore "mario".
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 15% tra i post del forum; il 9% sul web.
    Ti resta l’1% ... usalo bene!

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  3. #3
    Grazie, sei stato chiarissimo e sono riuscito a fare qualche piccolo passo avanti Scusa se approfitto ancora un po della tua conoscenza...magari mi eviti l'apertura di un nuovo topic =D
    Ecco dove mi sono attualmente "arenato":

    - in PHP ho il mio solito array multiplo, nome[x][x], con 4 valori definiti:
    nome[1][1]="mario"
    nome[1][2]="franco"
    nome[2][1]="tom"
    nome[2][2]=mary"

    Quello che devo fare è passare il tutto a Javascript. Utilizzo JSON: ci riesco ed ottengo questa stringa (diciamo che si tratta di 'xdati.stringa'):

    xdati.stringa= {"1":{"1":"mario","2":"franco"},"2":{"1":"tom","2" :"mary"}}

    Ora devo "solo" trasformare questa stringa in un array nome[x][y] da usare in javascript. Puoi indirizzarmi sulla retta via?
    Where there is a will, there is a way

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    3,651
    Grazie, sei stato chiarissimo e sono riuscito a fare qualche piccolo passo avanti
    Bene, mi fa piacere

    Scusa se approfitto ancora un po della tua conoscenza...magari mi eviti l'apertura di un nuovo topic =D
    Direi che lo hai già fatto. Per quest'altra richiesta è meglio proseguire sulla discussione che già hai aperto; anche se le richieste sono inerenti ad uno stesso tuo progetto, sono comunque due argomenti distinti.
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 15% tra i post del forum; il 9% sul web.
    Ti resta l’1% ... usalo bene!

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  5. #5
    Ok, ho trasferito la domanda nell'altro topic. Questo si può anche chiudere, grazie :-)
    Where there is a will, there is a way

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2017 vBulletin Solutions, Inc. All rights reserved.