2016-04-27 95 views
2

我有一些鍵和值的Javascript對象:如何通過鍵獲取Javascript對象的所有值?

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

我想要遍歷所有的鍵和檢索的所有值。

我試圖2種方式:

1)使用用於在鍵(VAR鍵)

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

這種解決方案的問題是,密鑰對象是一個數組,所以必須使用OBJ [按鍵[鍵]]]。 不是很漂亮。

此外,檢查「key4」,返回值是「0」而不是「」(空)。

2)及如何使用foreach

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

在這種情況下的問題是,如果我嘗試做:

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

的 「目標文件」 變量在foreach未定義!

什麼是迭代所有鍵檢索所有值的最佳方法?

謝謝

+0

@PranavCBalan該索引是第二個參數https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach – jcubic

+1

可能的重複[如何獲取所有屬性值的一個Javascript對象(不知道鍵)?](http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values-of-a-javascript-object-without-knowing-the-key ) –

回答

7

只需使用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

請注意,這是危險的,因爲TJ克勞德說,因爲它也會迭代任何繼承的屬性。例如,如果您執行Object.prototype.foo =「bar」',它將迭代五次而不是四次。 – Amadan

+0

你可以用'Object.hasOwnProperty()'來確保這個'for in'循環,它檢查給定的屬性是否不被繼承。 –

4

在你的第一個例子中,你使用for-in遍歷數組,這不是一般的好主意。要循環訪問數組,this answer有很多選項。

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

需要注意的是,你會看到兩個對象的自己性質,也那些從繼承:

如果通過對象的所有鍵要循環中,對象上使用for-in其原型。如果你只是想自己的屬性,你可以添加一個後衛:

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

...或使用Object.keys(在ES5介紹,2009年,因此不會對IE8;有一個墊片,如果你需要支持過時像IE8瀏覽器):

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

在這兩種情況下,你只能獲得對象的枚舉性能。如果您需要包括不可枚舉性能,達到getOwnPropertyNames

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

這將讓對象自身的(非繼承)屬性名稱,即使不可枚舉的,只要他們是字符串(他們總是在ES5和更早的版本中;在ES2015和更高版本中,他們通常是字符串,但如果您使用Symbol s,也可以是Symbol實例)。

getOwnPropertyNames也在ES5中引入,但我不認爲它可以被刪除,所以你不能在IE8或其他過時的瀏覽器中使用它。

0

奇怪的是,你有這個問題的obj undefined,它不應該發生。 這裏是另一種方式,除了其他答案。 只有當你不需要過濾的東西它是有用的,你只想擁有的所有值(和幾行)

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

請爲您的答案添加解釋。 –

+2

代碼只有答案對社區沒什麼用處。請看[回答] – JimHawkins

+0

oki doki,對不起! – Cris

0

我喜歡第一種方法比第二種更數組,但有不需要單獨存儲密鑰。讓我們考慮一下這個例子:

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

正如你所看到的,我們並不需要讀密鑰。出於任何目的,您可以使用這樣的function。例如:

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

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

從字面上可以有無數種方法可以使用它。在第二種方法中,forEach針對鍵而不是針對您正在解析的鍵的對象運行。您需要使用getOwnPropertyNames,正如T.J.Crowther已經指出的那樣。

相關問題