2009-03-23 9 views
109

Sagen Sie bitte ein Javascript-Objekt wie dieses:Wie kann ich auf Eigenschaften eines Javascript-Objekts zugreifen, wenn ich die Namen nicht kenne?

var data = { foo: 'bar', baz: 'quux' }; 

Sie die Eigenschaften von dem Eigenschaftsnamen zugreifen können:

var foo = data.foo; 
var baz = data["baz"]; 

Aber ist es möglich, diese Werte zu erhalten, wenn Sie das nicht wissen, Name der Eigenschaften? Ist es aufgrund der ungeordneten Natur dieser Eigenschaften unmöglich, sie auseinander zu halten?

In meinem Fall denke ich speziell an eine Situation, in der eine Funktion eine Reihe von Name-Wert-Paaren akzeptieren muss, aber die Namen der Eigenschaften können sich ändern.

Meine Gedanken darüber, wie dies bisher zu tun ist, besteht darin, die Namen der Eigenschaften der Funktion zusammen mit den Daten zu übergeben, aber das fühlt sich an wie ein Hack. Ich würde das lieber mit Introspektion machen, wenn möglich.

Antwort

46

Alte Versionen von JavaScript (< ES5) erfordern unter Verwendung einer for..in Schleife:

for (var key in data) { 
    if (data.hasOwnProperty(key)) { 
    // do something with key 
    } 
} 

ES5 führt Object.keys und Array#forEach, die dies ein wenig leichter macht:

var data = { foo: 'bar', baz: 'quux' }; 

Object.keys(data); // ['foo', 'baz'] 
Object.keys(data).map(function(key){ return data[key] }) // ['bar', 'quux'] 
Object.keys(data).forEach(function (key) { 
    // do something with data[key] 
}); 

ES2017 führt Object.values und Object.entries.

Object.values(data) // ['bar', 'quux'] 
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']] 
+1

Nun beantwortet das tatsächlich die Frage, gut gemacht @Adam Lassek, sehr schön gemacht. –

+0

Es ist irreführend, sowohl 'Name' als auch 'Wert' als Objektschlüssel zu verwenden. Diese Funktion gibt nur die Schlüssel in einer Liste zurück, nicht die Werte. {name1: 'value1', name2: 'value2'} verhindert Verwirrung bei Anfängern. Object.keys (Daten); // ['name1', 'name2'] –

+2

@JamesNicholson Ich stimme zu, um weniger verwirrend zu sein. –

10
for(var property in data) { 
    alert(property); 
} 
127

Sie können Schleife durch Tasten wie folgt aus:

for (var key in data) { 
    console.log(key); 
} 

Dieser "Name" und "Value" protokolliert.

Wenn Sie einen komplexeren Objekttyp haben (nicht nur ein einfaches, hashähnliches Objekt wie in der ursprünglichen Frage), sollten Sie nur Schlüssel durchlaufen, die zum Objekt selbst gehören, im Gegensatz zu Schlüsseln auf das Objekt der prototype:

for (var key in data) { 
    if (data.hasOwnProperty(key)) { 
    console.log(key); 
    } 
} 

Wie Sie bemerkt, die Schlüssel nicht zu sein in einer bestimmten Reihenfolge garantiert. Beachten Sie, wie dies aus der folgenden unterscheidet:

for each (var value in data) { 
    console.log(value); 
} 

Dieses Beispiel durch Werte Schleifen, so würde es log Property Name und 0. N.B .: Die for each Syntax wird meist nur in Firefox unterstützt, nicht jedoch in anderen Browsern.

Wenn Ihr Ziel-Browser ES5 unterstützen oder Ihre Website enthält es5-shim.js (empfohlen), können Sie auch Object.keys verwenden:

var data = { Name: 'Property Name', Value: '0' }; 
console.log(Object.keys(data)); // => ["Name", "Value"] 

und Schleife mit Array.prototype.forEach:

Object.keys(data).forEach(function (key) { 
    console.log(data[key]); 
}); 
// => Logs "Property Name", 0 
+0

ein neues Objekt abgefahren werden. Haben Sie das letzte mal gemacht und sind tatsächlich damit durchgekommen? Gut gemacht ... =) –

+0

Dies existiert in Firefox ([docs] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for_each...in)), aber der Punkt ist richtig dass es nicht universal ist. Ich werde die Antwort aktualisieren, um dies zu erwähnen. –

+25

BTW Alarm ist eine schlechte Möglichkeit, Dinge zu debuggen, versuchen Sie console.log – StackOverflowed

4

Sie werden oft wollen Untersuchen Sie die insbesondere Eigenschaften einer Instanz eines Objekts, ohne alle seine gemeinsamen Prototyp-Methoden und Eigenschaften:

Obj.prototype.toString= function(){ 
     var A= []; 
     for(var p in this){ 
      if(this.hasOwnProperty(p)){ 
       A[A.length]= p+'='+this[p]; 
      } 
     } 

    return A.join(', '); 
} 
0
var fs = require("fs"); 

fs.stat(process.argv[1], function(err, stats){ 
if (err) { 
    console.log(err.message); 
    return;  
} else { 
console.log(JSON.stringify(stats)); 

/* this is the answer here */ 

    for (var key in Object.keys(stats)){ 
    var t = Object.keys(stats)[key]; 
    console.log(t + " value =: " + stats[t] ); 
    } 

/* to here, run in node */ 
    } 
}); 
+0

Könnten Sie weitere Erklärungen hinzufügen? –

+0

'Object.keys (stats) [key]' macht keinen Sinn, wird immer 'undefiniert' sein. –

-2
var attr, object_information=''; 

for(attr in object){ 

     //Get names and values of propertys with style (name : value) 
     object_information += attr + ' : ' + object[attr] + '\n'; 

    } 


alert(object_information); //Show all Object 
+0

Dies fügt der akzeptierten Antwort nichts hinzu und präsentiert die Informationen in der am wenigsten nützlichen Weise, die möglich ist. Und vererbte Eigenschaften werden nicht berücksichtigt. –

2
function getDetailedObject(inputObject) { 
    var detailedObject = {}, properties; 

    do { 
     properties = Object.getOwnPropertyNames(inputObject); 
     for (var o in properties) { 
      detailedObject[properties[o]] = inputObject[properties[o]]; 
     } 
    } while (inputObject = Object.getPrototypeOf(inputObject)); 

    return detailedObject; 
} 

Dies wird alle Eigenschaften und ihre Werte erhalten (geerbt oder eigene, zählbare oder nicht) in einem neuen Objekt. Originalobjekt ist unberührt. Nun kann mit

var obj = { 'b': '4' }; //example object 
var detailedObject = getDetailedObject(obj); 
for(var o in detailedObject) { 
    console.log('key: ' + o + ' value: ' + detailedObject[o]); 
}