2010-10-20 115 views
3

給定一個對象是這樣的:的Javascript:獲取單個屬性名稱

{ name: "joe" } 

我想要得到的值「名」。我知道我可以使用for構造來迭代對象中的屬性,但是我要處理的對象將始終只有一個鍵:值對,而我不知道該屬性的名稱。爲了進一步說明:

var a = { age: 24 }; 
console.log(myFunc(a)) // Displays "age" 

var b = { job: "cook" }; 
console.log(myFunc(b)) // Displays "job" 

有沒有辦法做到這一點,而無需迭代對象?另外我想用純Javascript來做到這一點。沒有涉及的框架/庫。

+0

也許你應該使用一個數組inste ad'['age',24「]',然後用'a [0]'得到名字' – some 2010-10-20 22:08:32

回答

6

它是用.hasOwnProperty良好做法確保你沒有返回Object對象原型的屬性:

function myFunc(obj) { 
    for (var prop in obj) { 
     if (obj.hasOwnProperty(prop)) return prop; 
    } 
} 
+0

我很好奇,是否值得額外的函數調用。我的測試(在Firefox中)顯示對象原型在迭代期間總是會持續到最後。也許在所有瀏覽器中都不是這種情況? – mellowsoon 2010-10-20 22:22:23

+1

@mellowsoon,我即將在IE8及以下版本中使用它,繼承的屬性首先被枚舉! (在IE <= 8中嘗試[this test](http://jsfiddle.net/cmsalvado/cuFeK/)),如果你想要第一個可枚舉的**自己的屬性**,你應該使用'hasOwnProperty',儘管我會使用'if(Object.prototype.hasOwnProperty.call(obj,prop))'(可能會在方法中存儲一個引用使其更快),使它更安全*,因爲對象*可能*有一個名爲' hasOwnProperty',並且該屬性將*映射來自Object.prototype的方法。無論如何,這應該是被接受的答案,+1 @ @yan :) – CMS 2010-10-21 02:25:38

+1

在研究了hasOwnProperty()函數之後,我看到了它的重要性。所以我改變了這個正確的答案。 – mellowsoon 2010-10-23 04:33:33

1

爲什麼不重複?這只是一個步驟。我認爲你不能以任何其他方式得到它。如果讓你感覺更好,你甚至可以在第一步之後休息。

2

不,迭代是獲得屬性名稱唯一得到良好支持的方式。所以for...in就是這樣。只要將它隱藏在一個函數中就可以了。

但是,它也可能是值得想着你是否應該使用不同類型的對象,你的目的,說:{"property": "age", "value": 24},甚至["age", 24]

2

您可以遍歷對象的屬性和簡單地返回第一一。

function myFunc(obj) { 
    for (var prop in obj) { 
     return prop; 
    } 
} 

編輯:哎呀,你想要的屬性名稱,而不是價值

+5

你應該在'for-in'語句中真的使用'var prop ...'否則'prop'將變成全局的('window.prop'),或者如果它在作用域鏈中存在更高的地址,它將被覆蓋。 – CMS 2010-10-21 00:45:44

+0

@CMS謝謝,我甚至在我的回答中忘了這麼做:) – 2010-10-21 13:11:19

3

這似乎是關於最好的,你可以得到:

function myFunc(v) { 
    for (var x in v) { return { prop: x, val: v[x] }; } 
    return null; 
}; 
+0

爲什麼在退貨後中斷? – 2010-10-20 22:13:39

+0

爲了好玩,清晰,或者我只是無能......;) – 2010-10-20 22:17:36