Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    72

    Ordinamento array non richiesto

    Ho un array che contirne numeri in ordine sparso; ho bisogno di ricordarli così come sono, ma anche di ordinarli per altri scopi, quindi faccio:

    codice:
    valori = [1, 5, 2, 6];
    valori_originali = valori;
    
    //qui controllo con un alert e va tutto bene
    
    valori.sort(function(a, b){return b-a});
    ma a questo punto mi trovo entrambi gli array messi in ordine.. perchè? non doveva ordinare solo "valori" e lasciare inalterato "valori_originali"??

  2. #2
    Utente di HTML.it L'avatar di m4rko80
    Registrato dal
    Aug 2008
    residenza
    Milano
    Messaggi
    2,655
    Se assegni una variabile ad un altra verrà ereditato il suo valore. Devi creare una nuova variabile diversamente, ad esempio così:
    codice:
    valori = valori_originali.map(v=>v).sort(function(a, b){return b-a});

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    72
    allora.. ho provato con map e in effetti funziona
    codice:
    valori = [1, 5, 2, 6];
    
    valori_originali = valori.map(x => x);
    valori.sort(function(a, b){return b-a});
    
    //(valori ora viene ordinata, valori_originali resta com'era)
    ma non ho capito come mai avevo quel problema all'inizio.. il secondo array si "lega" al primo e continua a cambiare al cambiare del primo? (anche aggiungendo un elemento con push, ad esempio, lo prende anche il secondo).

    La stessa cosa con le variabili semplici numeriche non avviene
    codice:
    ab=10;
    cd=ab;
    
    ab++;
    
    //(ab è 11, ma cd è rimasto 10)

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    ma non ho capito come mai avevo quel problema all'inizio..
    Questo è il normale comportamento di JavaScript riguardo la gestione degli oggetti, rispetto ai valori di tipo primitivo.
    Qualsiasi oggetto (compresi gli array) viene istanziato per "riferimento". Questo significa che variabili diverse possono puntare allo stesso oggetto.

    Quando modifichi delle proprietà di un oggetto (compresi gli elementi di un array), ogni variabile che punta a quello stesso oggetto mostrerà giustamente l'oggetto modificato.

    Nel caso ti serva mantenere inalterato l'array originale (o un qualsiasi oggetto), dovrai crearne un clone; fai qualche ricerca del tipo "javascript clone array".

    Esistono diversi modi per clonare un array; uno è appunto il metodo map() che di fatto restituisce un nuovo array mantenendo inalterato quello originale.

    In alcuni casi c'è da valutare se si vuole ottenere una "copia superficiale" oppure una "copia profonda". Infatti un array può contenere sia valori primitivi sia altri oggetti (e questi stessi potrebbero contenere a loro volta altri oggetti ancora). In tal caso vale sempre il concetto iniziale di "riferimento" per cui, se si vuole creare un perfetto clone di tale array (compresi tutti i possibili oggetti annidati) è necessario iterare tutti questi oggetti in maniera profonda, per clonare ciascuno di essi.

    Chiaramente nel tuo caso, dato che l'array contiene solo valori primitivi, ti basta creare una copia superficiale.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

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 © 2025 vBulletin Solutions, Inc. All rights reserved.