Powiedzmy, że tworzę obiekt w ten sposób:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
Jaki jest najlepszy sposób na odzyskanie listy nazw nieruchomości? tzn. chciałbym skończyć z pewnymi zmiennymi „kluczami”, takimi jak:
keys == ["ircEvent", "method", "regex"]
javascript
johnstok
źródło
źródło
_.keys(myJSONObject)
Odpowiedzi:
W nowoczesnych przeglądarkach (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) możesz użyć wbudowanej metody Object.keys :
Powyższe ma pełne wypełnienie, ale uproszczoną wersją jest:
Ewentualnie wymienić
var getKeys
zObject.prototype.keys
co pozwala zadzwonić.keys()
na dowolny obiekt. Rozszerzenie prototypu ma pewne skutki uboczne i nie poleciłbym tego.źródło
for (var key in myObject) {...}
technika jest przydatna w środowiskach uruchomieniowych javascript poza przeglądarkami i wersją V8. Na przykład, gdy przekazujemy zapytania Rivascript zmniejszające mapę do Riaka,Object
obiekt nie istnieje, więcObject.keys
metoda nie jest dostępna.Object.keys
metoda (ECMAScript 5.1) zwraca tylko własne właściwości obiektu. Uważam to za ważne rozróżnienie.Jak wskazał slashnick , możesz użyć konstrukcji „for in”, aby iterować obiekt po nazwach atrybutów. Będziesz jednak iterował wszystkie nazwy atrybutów w łańcuchu prototypów obiektu. Jeśli chcesz iterować tylko nad własnymi atrybutami obiektu, możesz skorzystać z metody Object # hasOwnProperty () . Zatem mając następujące.
źródło
esc
klawisz, ponieważ obiekt miał około miliona właściwości, z których większość nie była używana, i otrzymałem alert.Jak odpowiedział Sam Dutton, w ECMAScript 5th Edition wprowadzono nową metodę do tego właśnie celu.
Object.keys()
zrobi co chcesz i jest obsługiwany w Firefox 4 , Chrome 6, Safari 5 i IE 9 .Możesz także bardzo łatwo zaimplementować tę metodę w przeglądarkach, które jej nie obsługują. Jednak niektóre implementacje nie są w pełni kompatybilne z programem Internet Explorer. Oto bardziej kompatybilne rozwiązanie:
Zauważ, że obecnie akceptowana odpowiedź nie obejmuje sprawdzenia hasOwnProperty () i zwróci właściwości, które są dziedziczone w łańcuchu prototypów. Nie uwzględnia również słynnego błędu DontEnum w programie Internet Explorer, w którym właściwości niepoliczalne w łańcuchu prototypów powodują, że lokalnie zadeklarowane właściwości o tej samej nazwie dziedziczą ich atrybut DontEnum.
Implementacja Object.keys () zapewni bardziej niezawodne rozwiązanie.
EDYCJA: po niedawnej dyskusji z Kangaxem , znanym współpracownikiem Prototypu, zaimplementowałem obejście błędu DontEnum na podstawie kodu jego
Object.forIn()
funkcji znalezionej tutaj .źródło
Object.prototype
. Często zdarza się jednak, że krótszy kod wygląda znacznie atrakcyjniej niż większy, bardziej solidny kod, ale celem tej odpowiedzi jest użycie ECMAScript 5thObject.keys()
, który można zaimplementować w przeglądarkach, które nie obsługują go za pomocą tego kodu. Wersja natywna byłaby jeszcze bardziej wydajna niż ta.Object.keys
zwraca tylko tablicę ciągów odpowiadających wyliczalnym właściwościom obiektu. Może to nie mieć kluczowego znaczenia podczas pracy z obiektami natywnymi (zdefiniowanymi przez użytkownika), ale powinno być bardzo widoczne w przypadku obiektów hosta (chociaż nieokreślone zachowanie obiektów hosta jest osobną - bolesną - historią). Aby wyliczyć wszystkie WSZYSTKIE (w tym niepoliczalne) właściwości, ES5 zapewniaObject.getOwnPropertyNames
(zobacz jego obsługę w mojej tabeli kompatybilności - kangax.github.com/es5-compat-table )Object.keys(stuff)
niestuff.keys()
?Pamiętaj, że Object.keys i inne metody ECMAScript 5 są obsługiwane przez Firefox 4, Chrome 6, Safari 5, IE 9 i nowsze wersje.
Na przykład:
Tabela zgodności ECMAScript 5: http://kangax.github.com/es5-compat-table/
Opis nowych metod: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
źródło
Object.getOwnPropertyNames(obj)
Ta funkcja pokazuje także właściwości niepoliczalne, oprócz właściwości pokazanych przez
Object.keys(obj)
.W JS każda właściwość ma kilka właściwości, w tym wartość logiczną
enumerable
.Ogólnie rzecz biorąc, niepoliczalne właściwości są bardziej „wewnętrzne” i rzadziej używane, ale czasem warto je zaglądać, aby zobaczyć, co się naprawdę dzieje.
Przykład:
Zwróć również uwagę, jak:
Object.getOwnPropertyNames
iObject.keys
nie wchodź do łańcucha prototypów, aby znaleźćbase
for in
robiWięcej informacji o łańcuchu prototypów tutaj: https://stackoverflow.com/a/23877420/895245
źródło
Jestem wielkim fanem funkcji zrzutu.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
źródło
https://j11y.io/demos/prettyprint/
?Można to zrobić za pomocą jQuery w następujący sposób:
źródło
jeśli próbujesz uzyskać tylko elementy, ale nie funkcje, ten kod może ci pomóc
jest to część mojej implementacji HashMap i chcę tylko kluczy, „to” to obiekt hashmap zawierający klucze
źródło
Działa to w większości przeglądarek, nawet w IE8, i nie są wymagane żadne biblioteki. var i jest twoim kluczem.
źródło
W przeglądarkach obsługujących js 1.8:
źródło
Mozilla ma pełne szczegóły implementacji, jak to zrobić w przeglądarce, która nie jest obsługiwana, jeśli to pomaga:
Możesz dołączyć go, jak chcesz, ale być może w jakimś
extensions.js
pliku na górze stosu skryptów.źródło
Posługiwać się
Reflect.ownKeys()
Object.keys i Object.getOwnPropertyNames nie może dostać zakaz przeliczalna właściwości. Działa nawet w przypadku właściwości niepoliczalnych .
źródło
IE nie obsługuje (i in obj) dla właściwości rodzimych. Oto lista wszystkich rekwizytów, które mogłem znaleźć.
Wygląda na to, że stackoverflow robi głupie filtrowanie.
Lista jest dostępna na dole tego posta grupy google: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
źródło
Ponieważ używam underscore.js w prawie każdym projekcie, użyłbym
keys
funkcji:Wynikiem będzie:
źródło
Opierając się na przyjętej odpowiedzi.
Jeśli obiekt ma właściwości, które chcesz nazwać, powiedz .properties () spróbuj!
źródło
Rozwiązanie działa w moich przypadkach i w różnych przeglądarkach:
źródło