2014-10-20 8 views
5

Stworzyłem obiekt JavaScript jakJak wymienić JavaScript Object nazwę właściwości dynamicznie

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

muszę zmienić old_name do new_name. Próbowałem już teraz:

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

I działa, ale kolejność obiektów zostanie zmieniona.

Na przykład:

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

Gdybym zastąpić obj1 z objone, tak:

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

Kolejność obiekt zmienione na:

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

Ale muszę zmienić sama nazwa właściwości, a nie kolejność, a także próbuję zastąpić ciąg znaków, ale ja myślę, że to nie jest właściwa droga, więc proszę zasugeruj mi kilka pomysłów.

+5

Obiekty nie mają zamówienia. – elclanrs

+0

Dlaczego zamówienie jest problemem? – Johan

+0

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

Odpowiedz

5

Obiekty nie mają zamówienia. Jakakolwiek widoczna kolejność jest nieokreślonym zachowaniem i nie można na niej polegać. nie zrobili, gdy padło pytanie, ale they do now:

  1. Niech klucze się nowa pusta lista.
  2. Dla każdej właściwości własny klucz P z O który jest indeksem całkowitą, w rosnącej kolejności numerycznej indeksu
    • Dodaj P jako ostatni element kluczy.
  3. Dla każdej właściwości własny klucz P z O że to łańcuch, ale nie jest indeksem całkowitą, w tworzeniu porządku własności
    • Dodaj P jako ostatni element kluczy .
  4. Dla każdej właściwości własny klucz P z O że to symbol, w celu utworzenia nieruchomość
    • Dodaj P jako ostatni element kluczy.
  5. Powrót klucze.

Twój sposób na zmianę nazwy własność jest jedynym sposobem na to zrobić: Tworzenie nowego, następnie usunięcie starego. Wykonanie tego zmieni się w miejscu, w którym pojawia się w kolejności obiektu, ponieważ zostało utworzone po poprzedniej właściwości.

Jeśli potrzebujesz zamówienia, użyj tablicy. Chociaż teoretycznie tablice nie mają również kolejności (ponieważ they're not really arrays), mamy konwencję, że mają one porządek, na podstawie wartości liczbowej indeksów wpisów: Wpis na indeksie 0 znajduje się przed wpisem o indeksie 1 i wkrótce. (A nowoczesne silniki JavaScript mogą i używają prawdziwych tablic, gdzie to możliwe.)

+0

To nie jedyny sposób. Możesz użyć: 'JSON.parse (JSON.stringify (myObj) .replace (stary, nowy))'. (Poważnie jednak, nie używaj tego) – Cerbrus

+0

@Cerbrus: :-) Jedyny sposób, który nie całkowicie zastępuje obiekt, być może. –

+0

@Cerbrus Nie, ty * nie mogłeś. * Surowy tekst zastępczy nie jest równoważny z powyższym kodem, ponieważ zastąpiłby każde wystąpienie 'old' z' nowym'. Nie tylko w jednej nazwie nieruchomości. Nie tylko w kluczach. –