2012-02-08 18 views
10

Ho questa struttura:Come passare il valore anziché il riferimento di un array?

var a = []; 
a.push({"level": 1, "column": 4, "parent": "none", "title": "Node 0", "content": "Parintele suprem", "show": "1"}); 
var b = a; 

a.push({"level": 1, "column": 5, "parent": "none", "title": "Node 1", "content": "Parintele suprem", "show": "1"}); 

console.log(b); 

Ora il problema è che b ha l'esatto contenuto come a (il contenuto dopo il secondo push). Questo suggerisce (correggimi se sbaglio) che quando ho detto b = a ho effettivamente dato b lo stesso riferimento di un, quindi qualsiasi cosa faccia in a ho in . Il fatto è che ho bisogno di passare il valore. Quindi ho le anteprime a, valore in b.

Modifica per rendere la domanda più chiara: come faccio a passare il valore anziché il riferimento?

+0

"Il fatto è che ho bisogno di passare il valore. Quindi ho le anteprime un valore in b ". O per scriverlo come una domanda:" Come faccio a passare il valore invece del referance? ". – zozo

risposta

13

Penso che si può usare questo per copiare il valore invece che il riferimento:

var b = a.slice(0); 

EDIT
come i commenti hanno menzionato ed è anche citato qui: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice

fetta non altera la matrice originale, ma restituisce una nuova copia "a livello singolo" che contiene copie degli elementi tagliati dall'array originale. Elementi dell'array originale vengono copiati nella nuova matrice come segue:

  • Per riferimenti agli oggetti (e non l'oggetto reale), copie fetta oggetto riferimenti nel nuovo array. Sia l'originale che il nuovo array si riferiscono allo stesso oggetto. Se un oggetto di riferimento cambia, le modifiche sono visibili sia per gli array nuovi che per quelli originali.

  • Per le stringhe ei numeri (non String e Number oggetti), copie fetta stringhe e numeri nel nuovo array. Le modifiche alla stringa o al numero in un array non influiscono sull'altro array.

Se un nuovo elemento viene aggiunto a uno degli array, l'altro array non viene modificato.

+1

Funziona come un sogno :). Non posso ancora accettare la risposta , ma lo farò tra 7 minuti (quando lo stack mi permetterà) – zozo

+2

Che funziona solo per gli array indicizzati numericamente, no? –

+0

Sembra così. Farò un test rapido dopo aver completato l'attività corrente :). Anche da ci sono più di 1 risposte valide Farò un post rispondere che la strega sarebbe più veloce ... dal mio test rapido sembra una fetta, ma dal momento che non ho una spiegazione logica non posso esserne sicuro – zozo

3

Sì, questo è il modo in cui l'assegnazione di riferimento funziona in javascript. Si vuole clone l'oggetto per fare una copia, che è purtroppo più coinvolto di quanto dovrebbe essere. I framework come MooTools offrono la soluzione più semplice oppure è possibile eseguire la propria funzione clone.

7

è possibile implementare un metodo clone come segue:

function clone(source) { 
    var result = source, i, len; 
    if (!source 
     || source instanceof Number 
     || source instanceof String 
     || source instanceof Boolean) { 
     return result; 
    } else if (Object.prototype.toString.call(source).slice(8,-1) === 'Array') { 
     result = []; 
     var resultLen = 0; 
     for (i = 0, len = source.length; i < len; i++) { 
      result[resultLen++] = clone(source[i]); 
     } 
    } else if (typeof source == 'object') { 
     result = {}; 
     for (i in source) { 
      if (source.hasOwnProperty(i)) { 
       result[i] = clone(source[i]); 
      } 
     } 
    } 
    return result; 
}; 

poi:

var b = clone(a); 

se si è certi che una è array, utilizzare solo Niklas di:

var b = a.slice(); 

ps: il mio inglese è scarso :)

Problemi correlati