Frage

    

Diese Frage bereits eine Antwort hier:

         

Wie kann ich aufzählen, die Eigenschaften eines JavaScript-Objekt?

Ich möchte eigentlich alle definierten Variablen und ihre Werte verzeichnen, aber ich habe gelernt, dass eine Variable definieren, tatsächlich eine Eigenschaft des Fensters Objekt erstellt.

War es hilfreich?

Lösung

Einfach genug:

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

Nun, werden Sie nicht private Variablen auf diese Weise erhalten, weil sie nicht verfügbar sind.


EDIT: @bitwiseplatypus ist richtig, dass, wenn Sie die hasOwnProperty() Methode verwenden, werden Sie Eigenschaften erhalten, die vererbt werden - aber ich weiß nicht, warum jemand mit der objektorientierten Programmierung vertraut etwas weniger erwarten würde! Typischerweise jemand, dass dies bringt wurde Douglas Crockford Warnungen über diese unterzogen, die ein wenig verwirren mich immer noch. Auch Vererbung ist ein normaler Bestandteil der OO-Sprachen und ist somit Teil JavaScript, ungeachtet es prototypische zu sein.

Nun, das sagte hasOwnProperty() ist nützlich für die Filterung, aber wir brauchen keine Warnung zu klingen, als ob es etwas gefährlich in vererbten Eigenschaften zu bekommen.

EDIT 2: @bitwiseplatypus bringt die Situation auf, die später zu einem Zeitpunkt, um Ihre Objekte Eigenschaften / Methoden jemand hinzufügen würde auftreten sollte, als wenn Sie Ihre Objekte ursprünglich geschrieben (über seinen Prototyp) - während es wahr ist, dass dieses unerwartete Verhalten verursachen könnten, ich persönlich sehen, dass nicht, wie mein Problem vollständig. Nur eine Frage der Stellungnahme. Außerdem, was, wenn ich entwerfe Dinge so, dass ich Prototypen beim Bau meiner Objekte verwenden und dennoch Code habe, iteriert über die Eigenschaften des Objekts und ich alle vererbten Eigenschaften will? Ich würde nicht hasOwnProperty() verwenden. Dann lassen Sie uns sagen, fügt jemand neue Eigenschaften später. Ist das meine Schuld, wenn die Dinge verhalten sich schlecht an diesem Punkt? Ich glaube nicht. Ich denke, das ist, warum jQuery, als Beispiel angegeben hat Möglichkeiten zu erweitern, wie es funktioniert (über jQuery.extend und jQuery.fn.extend).

Andere Tipps

Verwenden Sie eine for..in Schleife die Eigenschaften eines Objekts aufzuzählen, aber vorsichtig sein. Die Aufzählung wird Eigenschaften zurückgeben nicht nur von der Gegenstand aufgezählt werden, sondern auch von den Prototypen einer übergeordneten Objekte.

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'

Um mit vererbten Eigenschaften in Ihrer Aufzählung zu vermeiden, überprüfen hasOwnProperty():

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

Edit: Ich bin nicht einverstanden mit JasonBunting Aussage, die wir nicht brauchen, um Aufzählen vererbten Eigenschaften zu sorgen. Es ist Gefahr in Aufzählen über vererbte Eigenschaften, die Sie nicht erwartet werden, da es das Verhalten des Codes ändern kann.

Es spielt keine Rolle, ob dieses Problem in anderen Sprachen vorhanden ist; die Tatsache ist, es existiert, und JavaScript ist besonders anfällig, da Änderungen an ein Prototyp des Objekts Kind beeinflussen Objekte selbst wenn die Modifizierung nach der Instanzierung nimmt.

Aus diesem Grund JavaScript hasOwnProperty() bietet, und das ist, warum Sie es verwenden, um sollte, diesen Dritten Code (oder einen anderen Code, der einen Prototyp ändern könnte), um sicherzustellen, ist bei Ihnen nicht brechen. Neben Zugabe von ein paar zusätzlichen Bytes Code, gibt es keinen Nachteil hasOwnProperty() verwendet wird.

Die Standardmethode, die bereits mehrfach vorgeschlagen worden ist, ist:

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

Jedoch Internet Explorer 6, 7 und 8 haben einen Fehler in dem JavaScript-Interpreter, was den Effekt hat, dass einige Tasten werden nicht aufgelistet. Wenn Sie diesen Code ausführen:

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

Wenn alarmiert "12" in allen Browsern außer IE. IE einfach diesen Schlüssel ignorieren. Die betroffenen Schlüsselwerte sind:

  • isPrototypeOf
  • hasOwnProperty
  • toLocaleString
  • toString
  • valueOf

Um in IE wirklich sicher sein, das Sie etwas verwenden wie:

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]);
  }
}

Die gute Nachricht ist, dass EcmaScript 5 die Object.keys(myObject) Funktion definiert, die die Schlüssel eines Objekts als Array zurückgibt und einige Browser (zum Beispiel Safari 4) bereits implementieren.

In modernen Browsern (ECMAScript 5) alle enumerable Eigenschaften erhalten Sie tun können:

Object.keys (obj) (Überprüfen Sie den Link, um ein Snippet für die Abwärtskompatibilität zu älteren Browsern zu erhalten)

oder auch nicht-zählbare Eigenschaften zu erhalten:

Object.getOwnPropertyNames (obj)

ECMAScript 5 Kompatibilitätstabelle prüfen

Weitere Informationen: Was ist eine zählbare Attribut?

Ich denke, ein Beispiel für den Fall, dass ich überrascht hat, ist relevant:

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

Aber zu meiner Überraschung, ist der Ausgang

name : Cody
status : Surprised
forEach : function (obj, callback) {
    for (prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") {
            callback(prop);
        }
    }
}

Warum? Ein anderes Skript auf der Seite hat das Objekt Prototyp erweitert:

Object.prototype.forEach = function (obj, callback) {
  for ( prop in obj ) {
    if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) {
      callback( prop );
    }
  }
};
for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}

Einfacher JavaScript-Code:

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
});

Ich fand es ... for (property in object) { // do stuff } werden alle Eigenschaften auflisten und damit alle global deklarierten Variablen auf dem Fensterobjekt ..

Hier ist, wie die Eigenschaften eines Objekts aufzuzählen:

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

for (var key in params) {
  alert(key + "=" + params[key]);
}

Wenn Sie mit der Underscore.js Bibliothek können Sie Funktion Tasten :

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]

Sie können die for der Schleife verwenden.

Wenn Sie einen Array verwenden:

Object.keys(object1)

Ref. Object.keys ()

Python dict hat ‚Schlüssel‘ Methode, und das ist wirklich nützlich. Ich denke, in JavaScript wir dies etwas haben können:

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: Aber die Antwort von @ carlos-Ruana sehr gut funktioniert. Getestet habe ich Object.keys (Fenster), und das Ergebnis ist das, was ich erwartet hatte.

EDIT nach 5 Jahren: Es ist nicht sinnvoll Object zu verlängern, weil sie mit anderen Bibliotheken in Konflikt geraten können, die auf ihren Objekte verwenden keys wollen können, und es wird ein unvorhersehbares Verhalten auf Ihrem Projekt führt. @ Carlos-Ruana Antwort ist die richtige Art und Weise Schlüssel eines Objekts.

zu bekommen

Wenn Sie versuchen, die Eigenschaften, um aufzuzählen neuen Code gegen das Objekt zu schreiben, würde ich mit einem Debugger wie Firebug empfehlen, sie visuell zu sehen.

Eine weitere praktische Technik ist Prototype Object.toJSON () zu verwenden, um das Objekt zu JSON serialisiert, die Ihnen beiden Eigenschaftsnamen und Werte zeigen.

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

Ich bin noch ein Anfänger in JavaScript, aber ich schrieb eine kleine Funktion rekursiv alle Eigenschaften eines Objekts und seine Kinder drucken:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top