2015-04-17 201 views
0

我想從時間複雜度爲n的對象數組中提取所有鍵的名稱(僅限一個循環)。該陣列是如下:從對象數組中獲取鍵值

var addressArray = [{"city":"New York"},{"country":"USA"},{"zip": 45677}]; 

我想提取以下:

var addressKeys = ["city", "country", "zip"]. 

我能夠通過數組第一循環再利用的obj循環鍵來執行相同的,但該不太好。替代品是最受歡迎的。

+0

'addressArray'不是一個數組,它是一個對象 –

+0

編輯數組。它是一組對象。 –

回答

3

使用Object.keys來獲取密鑰。

if (typeof Object.keys !== "function") { 
    (function() { 
     Object.keys = Object_keys; 
     function Object_keys(objectToGet) { 
      var keys = [], name; 
      for (name in objectToGet) { 
       if (objectToGet.hasOwnProperty(name)) { 
        keys.push(name); 
       } 
      } 
      return keys; 
     } 
    })(); 
} 
+0

謝謝伊萬。 :) –

3

根據你的定義addressArray是一個對象而不是數組。您可以使用Object.keys()來獲取對象的鍵數組。

var addressKeys = Object.keys(addressArray); 

爲了支持older browsers,不支持,你可以使用Object.keys一個Polyfill

+0

@ArunPJony,我認爲這種方法比較慢,因爲它必須創建Object的實例並執行一些OOP方法。測試:http://jsperf.com/object-keys-vs-for-in – tika

1

注意,我切換到[]的用{}的:

var addressObject = {"city":"New York", "country":"USA", "zip": 45677}; 

var keys = []; 

for(var address in addressObject) 
{ 
    keys.push(address); 
} 

console.log(keys); 
+0

如果我有一個單一的對象,我不會問這個問題。 –

+0

@JyotirmoyPan你的例子有問題。您需要使用您想獲取密鑰的對象數組來更新它。 – Piwwoli

2

使用for-in環路訪問每個key-value對,然後推送到新陣列:(推薦)

for(var index in addressArray){ 
    addressKeys.push(index) 
} 

另一種解決方案是:

var addressKeys = Object.keys(addressArray) 

這是相對較慢。