Czy istnieje sprytny (tj. Zoptymalizowany) sposób zmiany nazwy klucza w obiekcie javascript?
Niezoptymalizowanym sposobem byłoby:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
javascript
object
key
rename
Jean Vincent
źródło
źródło
Odpowiedzi:
Uważam, że najbardziej kompletnym (i poprawnym) sposobem na zrobienie tego jest:
Ta metoda zapewnia zachowanie właściwości o zmienionej nazwie w stosunku do właściwości oryginalnej.
Wydaje mi się również, że możliwość zawinięcia tego w funkcję / metodę i wstawienia go
Object.prototype
jest nieistotna z punktu widzenia twojego pytania.źródło
if (old_key !== new_key)
na:if (old_key !== new_key && o[old_key])
Możesz zawinąć pracę w funkcję i przypisać ją do
Object
prototypu. Być może użyj płynnego stylu interfejsu, aby umożliwić przepływ wielu nazw.ECMAScript 5 Specyficzny
Chciałbym, żeby składnia nie była tak skomplikowana, ale zdecydowanie miło jest mieć większą kontrolę.
źródło
Object.defineProperty
.hasOwnProperty
sprawdzanie właściwości ifor ... in
pętli, to dlaczego ma to znaczenie, jeśli rozszerzamy Object?Jeśli mutujesz obiekt źródłowy, ES6 może to zrobić w jednej linii.
Lub dwie linie, jeśli chcesz utworzyć nowy obiekt.
źródło
[]
wokół jest kwadratowa klamranewKey
? Rozwiązanie działa bez tego.W przypadku, gdy ktoś musi zmienić nazwę listy właściwości:
Stosowanie:
źródło
my_object_property
namyObjectProperty
, ale jeśli moja właściwość była jednosłowa, klucz został usunięty. +1Chciałbym po prostu użyć tej
ES6(ES2015)
drogi!źródło
Jeśli nie chcesz mutować danych, rozważ tę funkcję ...
Dokładne wyjaśnienie Yazeed Bzadough https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd
źródło
Większość odpowiedzi tutaj nie utrzymuje porządku par klucz-wartość obiektu JS. Jeśli masz na ekranie formę par klucz-wartość obiektu, którą chcesz zmodyfikować, ważne jest na przykład zachowanie kolejności wpisów obiektów.
Sposób zapętlania obiektu JS przez ES6 i zamiany pary klucz-wartość na nową parę ze zmodyfikowaną nazwą klucza wyglądałby mniej więcej tak:
Rozwiązanie zachowuje kolejność wpisów, dodając nowy wpis w miejsce starego.
źródło
Możesz spróbować lodash
_.mapKeys
.źródło
Odmiana wykorzystująca funkcję destrukcji obiektów i operatora rozprzestrzeniania
źródło
Osobiście najskuteczniejszy sposób zmiany nazwy kluczy w obiekcie bez implementacji dodatkowych ciężkich wtyczek i kół:
Możesz go również owinąć,
try-catch
jeśli Twój obiekt ma niepoprawną strukturę. Działa świetnie :)źródło
'a'
w{ a: 1, aa: 2, aaa: 3}
lub spróbuj zmienić nazwę obiektu z wartościami, które są niczym więcej niż ciągami, liczbami lub wartościami logicznymi, albo spróbuj z odwołaniami cyklicznymi.Aby dodać prefiks do każdego klucza:
źródło
Zrobiłbym coś takiego:
źródło
Powiedziałbym, że z koncepcyjnego punktu widzenia lepiej byłoby po prostu zostawić stary obiekt (ten z serwisu internetowego) w obecnej postaci i umieścić potrzebne wartości w nowym obiekcie. Zakładam, że i tak wyodrębniasz określone pola w tym czy innym miejscu, jeśli nie na kliencie, to przynajmniej na serwerze. Fakt, że zdecydowałeś się używać nazw pól, które są takie same jak te z serwisu internetowego, tylko małe litery, tak naprawdę tego nie zmienia. Radziłbym więc zrobić coś takiego:
Oczywiście przyjmuję tutaj różne założenia, co może nie być prawdą. Jeśli to Cię nie dotyczy lub jest zbyt wolne (prawda? Nie testowałem, ale wyobrażam sobie, że różnica maleje wraz ze wzrostem liczby pól), zignoruj to wszystko :)
Jeśli nie chcesz tego robić i musisz obsługiwać tylko określone przeglądarki, możesz również użyć nowych programów pobierających, aby zwrócić również „wielkie litery (pola)”: patrz http://robertnyman.com/2009/05/28 / getters-and-setters-with-javascript-code-samples-and-demos / oraz linki na tej stronie, aby uzyskać więcej informacji.
EDYTOWAĆ:
Niesamowicie, jest to prawie dwa razy szybsze, przynajmniej na moim FF3.5 w pracy. Zobacz: http://jsperf.com/spiny001
źródło
Chociaż nie daje to lepszego rozwiązania w kwestii zmiany nazwy klucza, zapewnia on szybki i łatwy sposób zmiany nazwy wszystkich kluczy w obiekcie przy jednoczesnym braku mutacji zawartych w nich danych.
źródło
Niektóre rozwiązania wymienione na tej stronie mają pewne skutki uboczne:
Oto rozwiązanie, które utrzymuje pozycję klucza w tym samym miejscu i jest kompatybilne z IE9 +, ale musi utworzyć nowy obiekt i może nie być najszybszym rozwiązaniem:
Uwaga: IE9 może nie obsługiwać każdego w trybie ścisłym
źródło
Oto przykład utworzenia nowego obiektu z kluczami o zmienionych nazwach.
źródło
Jeszcze inny sposób z najbardziej wydajną metodą REDUKCJI .
źródło
To jest mała modyfikacja, którą wprowadziłem do funkcji pomber; Aby móc wziąć tablicę obiektów zamiast samego obiektu, a także można aktywować indeks. także „Klucze” mogą być przypisywane przez tablicę
test
źródło
Twoja droga jest zoptymalizowana, moim zdaniem. Ale skończysz z uporządkowanymi kluczami. Nowo utworzony klucz zostanie dołączony na końcu. Wiem, że nigdy nie powinieneś polegać na kolejności kluczy, ale jeśli musisz ją zachować, będziesz musiał przejść przez wszystkie klucze i zbudować nowy obiekt jeden po drugim, zastępując dany klucz podczas tego procesu.
Lubię to:
źródło
źródło
po prostu spróbuj w swoim ulubionym edytorze <3
źródło