Jak wyliczyć właściwości obiektu JavaScript? [duplikat]

To pytanie ma już odpowiedź tutaj:

Jak wyliczyć właściwości obiektu JavaScript?

Chcę wyświetlić listę wszystkich zdefiniowanych zmiennych i ich wartości, ale nauczyłem się, że zdefiniowanie zmiennej faktycznie tworzy właściwość okna obiekt.

Author: Peter Mortensen, 2008-09-17

14 answers

Proste:

for(var propertyName in myObject) {
   // propertyName is what you want
   // you can get the value like this: myObject[propertyName]
}

Teraz nie otrzymasz w ten sposób prywatnych zmiennych, ponieważ nie są one dostępne.


EDIT: @ bitwiseplatypus jest poprawne, że jeśli nie użyjesz metody hasOwnProperty(), Otrzymasz dziedziczone Właściwości-Nie wiem jednak, dlaczego ktoś zaznajomiony z programowaniem obiektowym spodziewałby się czegoś mniej! Zazwyczaj ktoś, kto o tym wspomina, został poddany ostrzeżeniom Douglasa Crockforda o tym, co wciąż mnie myli. trochę. Ponownie, dziedziczenie jest normalną częścią języków OO i dlatego jest częścią JavaScript, mimo że jest prototypowe.

Teraz, że powiedział, hasOwnProperty() jest przydatne do filtrowania, ale nie musimy wydawać ostrzeżenia tak, jakby było coś niebezpiecznego w uzyskiwaniu odziedziczonych właściwości.

EDIT 2: @ bitwiseplatypus przywołuje sytuację, która miałaby miejsce, gdyby ktoś dodał właściwości / metody do Twoich obiektów w momencie późniejszym niż ty oryginalnie napisałeś swoje obiekty (za pośrednictwem swojego prototypu) - chociaż prawdą jest, że może to spowodować nieoczekiwane zachowanie, ja osobiście nie widzę tego jako mojego problemu całkowicie. To tylko kwestia opinii. Poza tym, co jeśli projektuję rzeczy w taki sposób, że używam prototypów podczas budowy moich obiektów, a mimo to mam kod, który iteruje nad właściwościami obiektu i chcę wszystkie odziedziczone właściwości? Nie użyłbym hasOwnProperty(). Potem, powiedzmy, ktoś dodaje nowe właściwości później. Czy to moja wina, jeśli rzeczy zachowują się źle w tym momencie? Nie sądzę. Myślę, że to dlatego jQuery, jako przykład, ma określone sposoby rozszerzenia tego, jak to działa (poprzez jQuery.extend i jQuery.fn.extend).

 746
Author: Jason Bunting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:30

Użyj pętli for..in, aby wyliczyć właściwości obiektu, ale bądź ostrożny. Wyliczenie zwróci właściwości nie tylko wyliczanego obiektu, ale także prototypów dowolnych obiektów nadrzędnych.

var myObject = {foo: 'bar'};

for (var name in myObject) {
  alert(name);
}

// results in a single alert of 'foo'

Object.prototype.baz = 'quux';

for (var name in myObject) {
  alert(name);
}

// results in two alerts, one for 'foo' and one for 'baz'

Aby uniknąć uwzględniania dziedzicznych właściwości w wyliczeniu, sprawdź hasOwnProperty():

for (var name in myObject) {
  if (myObject.hasOwnProperty(name)) {
    alert(name);
  }
}

Edit: nie zgadzam się ze stwierdzeniem Jasonbuntinga, że nie musimy się martwić wyliczaniem dziedzicznych właściwości. Istnieje niebezpieczeństwo w wyliczaniu nad odziedziczone właściwości, których się nie spodziewasz, ponieważ mogą zmienić zachowanie Twojego kodu.

Nie ma znaczenia, czy ten problem istnieje w innych językach; faktem jest, że istnieje, a JavaScript jest szczególnie podatny, ponieważ modyfikacje prototypu obiektu wpływają na obiekty potomne, nawet jeśli zmiana ma miejsce po utworzeniu instancji.

Dlatego JavaScript dostarcza hasOwnProperty() i dlatego powinieneś go używać, aby zapewnić, że kod strony trzeciej (lub jakikolwiek inny inny kod, który może zmodyfikować prototyp) nie łamie twojego. Poza dodaniem kilku dodatkowych bajtów kodu, nie ma żadnych minusów w użyciu hasOwnProperty().

 211
Author: Ryan Grove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 23:02:09

Standardowy sposób, który został już zaproponowany kilka razy to:

for (var name in myObject) {
  alert(name);
}

Jednak Internet Explorer 6, 7 i 8 mają błąd w interpreterze JavaScript, który powoduje, że niektóre klucze nie są wyliczane. Jeśli uruchomisz ten kod:

var obj = { toString: 12};
for (var name in obj) {
  alert(name);
}

If alarmuje "12" we wszystkich przeglądarkach z wyjątkiem IE. IE po prostu zignoruje ten klucz. Wartości klucza, których dotyczy problem, to:

  • isPrototypeOf
  • hasOwnProperty
  • toLocaleString
  • toString
  • valueOf

Być naprawdę bezpieczne w IE trzeba użyć czegoś takiego:

for (var key in myObject) {
  alert(key);
}

var shadowedKeys = [
  "isPrototypeOf",
  "hasOwnProperty",
  "toLocaleString",
  "toString",
  "valueOf"
];
for (var i=0, a=shadowedKeys, l=a.length; i<l; i++) {
  if map.hasOwnProperty(a[i])) {
    alert(a[i]);
  }
}

Dobrą wiadomością jest to, że EcmaScript 5 definiuje funkcję Object.keys(myObject), która zwraca klucze obiektu jako tablicę i niektóre przeglądarki (np. Safari 4) już ją implementują.

 49
Author: Fabian Jakobs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-31 16:31:43

W nowoczesnych przeglądarkach (ECMAScript 5) aby uzyskać wszystkie właściwości wyliczeniowe, możesz wykonać:

Obiekt.klucze (obj) (Sprawdź odsyłacz, aby uzyskać fragment zgodności wstecznej w starszych przeglądarkach)

Lub aby uzyskać również nieujemne właściwości:

Obiekt.getOwnPropertyNames (obj)

Sprawdź tabelę zgodności ECMAScript 5

Dodatkowe informacje: Co to jest atrybut wyliczalny?

 40
Author: Carlos Ruana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-07 11:54:39

Myślę, że przykład przypadku, który mnie zaskoczył jest istotny:

var myObject = { name: "Cody", status: "Surprised" };
for (var propertyName in myObject) {
  document.writeln( propertyName + " : " + myObject[propertyName] );
}

Ale ku mojemu zdziwieniu, wyjście jest

name : Cody
status : Surprised
forEach : function (obj, callback) {
    for (prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") {
            callback(prop);
        }
    }
}
Dlaczego? Kolejny skrypt na stronie rozszerzył prototyp obiektu:
Object.prototype.forEach = function (obj, callback) {
  for ( prop in obj ) {
    if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) {
      callback( prop );
    }
  }
};
 22
Author: cyberhobo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-02 19:35:04
for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}
 14
Author: Andrew Hedges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 22:51:50

Prosty kod JavaScript:

for(var propertyName in myObject) {
   // propertyName is what you want.
   // You can get the value like this: myObject[propertyName]
}

JQuery:

jQuery.each(obj, function(key, value) {
   // key is what you want.
   // The value is in: value
});
 10
Author: EmRa228,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 22:51:25

Znalazłem... for (property in object) { // do stuff } wyświetli wszystkie właściwości, a zatem wszystkie globalnie zadeklarowane zmienne w obiekcie window..

 9
Author: davenpcj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-15 14:36:27

Jeśli używasz podkreślenia .biblioteka js , możesz użyć funkcji Klucze :

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]
 8
Author: dkl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 22:51:53

Oto jak wyliczyć właściwości obiektu:

var params = { name: 'myname', age: 'myage' }

for (var key in params) {
  alert(key + "=" + params[key]);
}
 8
Author: Chtiwi Malek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 22:52:14

Python 's dict ma metodę 'keys' , i to jest naprawdę przydatne. Myślę, że w JavaScript możemy mieć coś takiego:

function keys(){
    var k = [];
    for(var p in this) {
        if(this.hasOwnProperty(p))
            k.push(p);
    }
    return k;
}
Object.defineProperty(Object.prototype, "keys", { value : keys, enumerable:false });

EDIT: ale odpowiedź @ carlos-ruana działa bardzo dobrze. Testowałem obiekt.klawiszy (okno), a wynik jest tym, czego się spodziewałem.

Edycja po 5 latach: nie jest dobrym pomysłem przedłużanie Object, ponieważ może to kolidować z innymi bibliotekami, które mogą chcieć używać keys na swoich obiektach i spowoduje nieprzewidywalne zachowanie w Twoim projekcie. @ carlos-ruana odpowiedz jest poprawny sposób uzyskiwania kluczy obiektu.

 6
Author: Fabio Montefuscolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-07 16:40:38

Możesz użyć for of loop.

Jeśli chcesz użyć tablicy:

Object.keys(object1)

Ref. obiekt.klucze()

 1
Author: Walle Cyril,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-25 12:03:24

Jeśli próbujesz wyliczyć właściwości w celu napisania nowego kodu przeciwko obiektowi, polecam użycie debuggera takiego jak Firebug, aby zobaczyć je wizualnie.

Inną przydatną techniką jest użycie obiektu Prototype ' a.tojson() do serializacji obiektu do JSON, który wyświetli zarówno nazwy właściwości, jak i wartości.

var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
Object.toJSON(data);
//-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}'

Http://www.prototypejs.org/api/object/tojson

 0
Author: Chase Seibert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 19:45:42

Nadal jestem początkujący w JavaScript, ale napisałem małą funkcję do rekurencyjnego drukowania wszystkich właściwości obiektu i jego dzieci:

getDescription(object, tabs) {
  var str = "{\n";
  for (var x in object) {
      str += Array(tabs + 2).join("\t") + x + ": ";
      if (typeof object[x] === 'object' && object[x]) {
        str += this.getDescription(object[x], tabs + 1);
      } else {
        str += object[x];
      }
      str += "\n";
  }
  str += Array(tabs + 1).join("\t") + "}";
  return str;
}
 0
Author: Felix Lapalme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-02 19:35:56