2014-10-20 18 views
5

ho creato un oggetto JavaScript comeCome sostituire il nome della proprietà oggetto JavaScript dinamicamente

var obj={} 
var prop = {} 
prop.name= "name", 
prop.value = "10" 
obj[old_name] = prop; 

ho bisogno di cambiare il old_name-new_name. Ho provato

obj[new_name] = obj[old_name]; 
delete obj[old_name]; 

E funziona ma, l'ordine dell'oggetto viene modificato.

Ad esempio:

{"obj1":{"name:name","value:10"},"obj2":{"name:name","value:10"}} 

Se sostituisco obj1 con objone, in questo modo:

obj[objone ] = obj[obj1]; 
delete obj[obj1 ]; 

L'oggetto ordine cambiato in:

{"obj2":{"name:name","value:10"},"objone":{"name:name","value:10"}}] 

Ma ho bisogno di cambiare la nome della proprietà da solo e non l'ordine, e provo anche la sostituzione delle stringhe ma io pensate che non sia il modo giusto, quindi per favore suggeritemi qualche idea.

+5

Gli oggetti non hanno ordine. – elclanrs

+0

Perché l'ordine è un problema? – Johan

+0

http://stackoverflow.com/questions/4647817/javascript-object-rename-key – Dave

risposta

5

Gli oggetti non hanno ordine. Qualsiasi ordine apparente che vedi è un comportamento non specificato e non puoi fare affidamento su di esso. Non hanno quando la domanda è stata posta, ma they do now:

  1. Let chiavi essere una nuova lista vuota.
  2. Per ogni chiave P di O proprietà che è un indice intero, in ordine crescente indice numerico
    • Aggiungere P come ultimo elemento di chiavi.
  3. Per ogni proprietà chiave P di O che è una stringa, ma non è un indice intero, per creazione proprietà
    • Aggiungere P come ultimo elemento di chiavi .
  4. Per ogni chiave P di O che è un simbolo proprietà, al fine di creazione proprietà
    • Aggiungi P come ultimo elemento di chiavi.
  5. Ritorno chiavi.

Il tuo modo di rinominare la proprietà è l'unico modo di farlo: Creazione di una nuova, quindi rimuovendo il vecchio. Ciò cambierà dove appare nell'ordine dell'oggetto, perché è stato creato dopo la proprietà precedente.

Se è necessario ordinare, utilizzare un array. Mentre in teoria le matrici non hanno ordine o (perché they're not really arrays), abbiamo la convenzione che essi hanno ordine, sulla base del valore allora numerica degli indici delle voci: la voce di indice 0 è prima dell'entrata in corrispondenza dell'indice 1 e presto. (E i motori JavaScript moderni possono utilizzare e utilizzare array reali ove possibile.)

+0

Questo non è l'unico modo. Puoi _could_ usare: 'JSON.parse (JSON.stringify (myObj) .replace (old, new))'. (Seriamente però, non usare questo) – Cerbrus

+0

@Cerbrus: :-) L'unico modo che non sostituisce completamente l'oggetto, forse. –

+0

@Cerbrus No, non è possibile *. La sostituzione testuale non è equivalente al codice precedente perché sostituisce ogni occorrenza di "vecchio" con "nuovo". Non solo in un nome di proprietà. Non solo nelle chiavi. –

Problemi correlati