2016-04-27 3 views
2

Ich habe ein Javascript-Objekt mit einigen Schlüsseln und Werten:Wie erhalten Sie alle Werte eines Javascript-Objekts mit seinen Schlüsseln?

var obj = { 
    "key1" : "val1", 
    "key2" : "val2", 
    "key3" : "val3", 
    "key4" : "" 
} 

Ich möchte alle Schlüssel zu durchlaufen und alle Werte abgerufen werden.

habe ich versucht, 2 Möglichkeiten:

1) Unter Verwendung for (var Schlüssel Schlüssel)

var keys = Object.keys(obj); 
for (var key in keys) { 
    // ... 
} 

Das Problem bei dieser Lösung ist, dass Schlüssel-Objekt ein Array ist, so habe ich obj [verwenden Tasten [Taste]]]. Nicht sehr hübsch.

Bei der Überprüfung von "key4" ist der Rückgabewert "0" anstelle von "" (leer).

2) Mit forEach

Object.keys(obj).forEach(function(key){ 
    // ... 
}); 

Das Problem in diesem Fall ist, dass wenn ich versuche zu tun:

Object.keys(obj).forEach(function(key){ 
    obj[key]; // <- obj is undefined !! 
}); 

Die "obj" Variable in der foreach nicht definiert ist!

Was ist der beste Weg, um alle Schlüssel zum Abrufen aller Werte zu durchlaufen?

Dank

+0

@PranavCBalan der Index ist das zweite Argument https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach – jcubic

+1

Mögliches Duplikat von [So erhalten Sie alle Eigenschaftenwerte von a Javascript-Objekt (ohne die Schlüssel zu kennen)?] (Http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values-of-a-javascript-object-without-knowing-the-key) –

Antwort

7

Verwenden Sie einfach for in.

var obj = { 
    "key1" : "val1", 
    "key2" : "val2", 
    "key3" : "val3", 
    "key4" : "" 
}; 

for (var key in obj) { 

    console.log(key); // key1 and etc... 
    console.log(obj[key]); // val1 and etc... 
} 
+1

Beachten Sie, dass dies gefährlich ist, wie TJ Crowder sagt, da es auch über alle geerbten Eigenschaften iterieren wird. Zum Beispiel wird es fünfmal anstelle von vier iterieren, wenn Sie 'Object.prototype.foo =" bar "' tun. – Amadan

+0

Sie könnten diese 'for in'-Schleife mit 'Object.hasOwnProperty()' sichern, die überprüft, ob eine bestimmte Eigenschaft nicht geerbt ist. –

4

In Ihrem ersten Beispiel verwenden Sie for-in durch ein Array-Schleife, die nicht generell eine gute Idee ist. Um Arrays zu durchlaufen, hat this answer viele Optionen für Sie.

Wenn Sie alle einer Objektschlüssel Schleife möchten, verwenden Sie for-in auf dem Objekt:

for (var key in obj) { 
    var value = obj[key]; 
    // ... 
} 

Beachten Sie, dass sowohl die eigenen Eigenschaften des Objekts sehen werden und auch diejenigen, es erbt von sein Prototyp. Wenn Sie nur eigene Eigenschaften möchten, können Sie einen Wächter hinzu:

for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
     var value = obj[key]; 
     // ... 
    } 
} 

... oder benutzen Sie Object.keys (in ES5 eingeführt, im Jahr 2009, also nicht auf IE8, es gibt eine Shim, wenn Sie veraltet unterstützen müssen Browser wie IE8):

Object.keys(obj).forEach(function(key) { 
    var value = obj[key]; 
    // ... 
}); 

In beiden Fällen werden Sie nur das enumerable Eigenschaften des Objekts erhalten.Wenn Sie nicht-zählbare Eigenschaften einschließen müssen, erreichen für getOwnPropertyNames:

Object.getOwnPropertyNames(obj).forEach(function(key) { 
    var value = obj[key]; 
    // ... 
}); 

, dass das Objekt der eigenen (nicht vererbten) Eigenschaftsnamen erhalten, auch wenn nicht-zählbare, solange sie Strings sind (die sie immer in ES5 und früher sind, in ES2015 und später sind sie normalerweise Zeichenfolgen, können aber auch Symbol Instanzen sein, wenn Sie Symbol s verwenden.

getOwnPropertyNames wurde auch in ES5 eingeführt, aber ich glaube nicht, dass es Shimmed sein kann, so dass Sie es nicht in IE8 oder anderen veralteten Browsern verwenden können.

0

Es ist seltsam, dass Sie dieses Problem von obj undefined haben, sollte es nicht passieren. Hier ist es ein weiterer Weg dazu, zusätzlich zu den anderen Antworten. Es ist nur sinnvoll, wenn Sie den Filter nicht etwas brauchen, und Sie wollen einfach nur mit allen Werten ein Array haben (und einige Zeilen)

var values = [] 
    Object.keys(object) 
    .every((prop) => values.push(object[prop])) 
+4

Bitte fügen Sie eine Erklärung zu Ihrer Antwort hinzu. –

+2

Nur Code-Antworten sind für die Community nicht sehr nützlich. Bitte schauen Sie auf [antworten] – JimHawkins

+0

oki doki, sorry! – Cris

0

Ich mag den ersten Ansatz viel mehr als die zweite, aber es ist keine Notwendigkeit, die Schlüssel separat zu speichern. Betrachten wir dieses Beispiel:

function parseValues(obj, operation) { 
    for (key in obj) { 
     operation(obj[key], key); 
    } 
} 

Wie Sie sehen können, mussten wir die Schlüssel nicht lesen. Sie können ein function so für alle Zwecke verwenden. Zum Beispiel:

var myObject = {a: 1, b: 2, c: 3}; 

parseValues(myObject, function(item, key) { 
    if (key !== "b") { 
     if (item > 1) { 
      myObject[key] = item * 2; 
     } 
    } 
}); 

Es gibt buchstäblich unendlich viele Möglichkeiten, wie Sie das verwenden können. Bei dem zweiten Ansatz läuft die forEach für die Schlüssel und nicht für das Objekt, dessen Schlüssel Sie analysieren. Sie müssen getOwnPropertyNames verwenden, wie T.J.Crowther bereits darauf hingewiesen hat.

Verwandte Themen