Iterowanie po każdej właściwości obiektu w javascript przy użyciu Prototype?


89

Czy istnieje sposób na iterację wszystkich właściwości obiektu przy użyciu struktury Prototype JavaScript?

Oto sytuacja: Otrzymuję odpowiedź AJAX w formacie JSON, która wygląda mniej więcej tak:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

Jeśli ocenię tę odpowiedź json w zmiennej response, chcę mieć możliwość iteracji po każdej właściwości w response.barobjobiekcie, aby zobaczyć, które indeksy są prawdziwe, a które fałszywe.

Prototyp ma jedno Object.keys()i drugie i, Object.values()co dziwne, nie ma prostej Object.each()funkcji! Mógłbym wziąć wyniki Object.keys () i Object.values ​​() i odnieść się do drugiego, gdy przechodzę przez jeden z nich, ale to jest taki hack, że jestem pewien, że istnieje właściwy sposób na zrobienie tego!

Odpowiedzi:


42

Najpierw musisz przekonwertować literał obiektu na skrót prototypu :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

Idealny! To jest dokładnie to, czego szukałem.
OverloadUT

57
Niestety, ponieważ podobne pytanie zostało zamknięte, takie, które chciało tylko powtórzyć prosty obiekt javascript bez Prototype, teraz muszę potraktować tę odpowiedź tak, jakby była taka sama, jak pytanie, które zostało zamknięte z powodu „duplikacji”. A więc okropny przykład, ponieważ zmusza użytkownika do załadowania Prototype. Użytkownik nie powiedział nic o Prototype, więc zmuszanie go do załadowania niechcianej biblioteki nie jest przydatne. (pamiętaj, traktując to tak, jakby to był naprawdę duplikat). Gdyby drugie pytanie nie zostało zamknięte z powodu fałszywego twierdzenia o powieleniu, nie musiałbym odrzucać odpowiedzi.

2
Czy pytający nie wspomniał, że chce Prototypu (czy też pytanie zostało zredagowane?)? Zresztą wszystko dobrze
emurano

Nie ma potrzeby ładowania zewnętrznej biblioteki
Healkiss

553

Nie ma tu potrzeby korzystania z Prototype: JavaScript ma for..inpętle. Jeśli nie masz pewności, że nikt się nie bawił Object.prototype, sprawdź hasOwnProperty()również, tj

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
Dziękujemy za właściwą odpowiedź bez zmuszania nas do załadowania niechcianej biblioteki.

8
to nie jest prawidłowa odpowiedź. pytania mówią, że trzeba użyć prototypu! wolność wyboru - haha ​​...
Sven Larson

1
Oryginalny tytuł tego pytania wspominał o Prototypie, który dodałem dla jasności. To pytanie, o czym świadczy pierwsza linia nadwozia, dotyczyło konkretnie środowiska, w którym używany jest Prototyp.
OverloadUT

1
Im więcej piszesz w Javascript, tym bardziej znienawidzisz pisanie forpętli :)
Tryptyk

13
Niestety, jest to pytanie, które pojawia się jako nr 1, jeśli wyszukujesz w Google coś w rodzaju „jak iterować po javascript każdej właściwości obiektu”, więc wiele osób, które tu przyjeżdżają, prawdopodobnie szuka odpowiedzi na to pytanie. Pytanie, którego szukają, brzmi: stackoverflow.com/questions/921789/… , co naprawdę nie ma nic wspólnego z literałami obiektów.
Baxissimo

0

Powinieneś iterować po klawiszach i uzyskać wartości za pomocą nawiasów kwadratowych.

Zobacz: Jak wyliczyć właściwości obiektu javascript?

EDYCJA: Oczywiście to sprawia, że ​​pytanie jest duplikatem.


Ta metoda jest zdecydowanie odradzana w dokumentacji Prototype: prototypejs.org/api/array
OverloadUT

1
Nie sądzę też, żeby to był duplikat, ponieważ szukałem rozwiązania natywnego dla prototypu, które otrzymałem. Drugie pytanie jest przyzwoite dla kogoś, kto nie chce używać frameworka, ale to rozwiązanie jest znacznie bezpieczniejsze, jeśli używasz Prototype.
OverloadUT

1
@OverloadUT: nie czytałeś wystarczająco uważnie: odradza się iterowanie po właściwościach tablic, a nie zwykłych obiektów
Christoph
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.