2011-03-27 84 views
6

例如,我有這樣一個對象:如何在javascript中獲取對象的名稱?

var a = { 
    'light': 'good', 
    'dark' : { 
     'black': 'bad', 
     'gray' : 'not so bad' 
    } 
} 

和這樣的代碼:

var test = function(obj) { 
    // do smth with object 
    // I need to get obj's name ('dark' in my way) 
} 
test(a.dark); 

如何獲得在函數體對象的名稱。所以我的意思是我應該知道obj的名字是'黑暗'。

我試過檢查對象與螢火蟲,但它只是顯示對象的屬性。它不顯示一些內部方法或屬性,我可以通過它們知道

謝謝。

+0

參考此問題:http://stackoverflow.com/questions/722668/traverse-all-the-nodes-of-a-json-object-tree-with-javascript。它解釋瞭如何獲取對象名稱和值。 – 2011-03-27 08:45:28

回答

11

你不能。您只將對象{ black : 'bad', gray : 'not so bad' }傳遞到test。此對象本質上不具有名稱「dark」,它只是碰巧存在的對象dark的對象a。將這些信息傳遞給函數時,這些信息將無法挽回。

你基本上試圖檢索變量名稱,該值在傳入函數之前保存該值。這是不可能的。

+3

+1對象和變量是兩個完全不同的野獸,每個對象由0到無窮大變量引用,不知道任何關於它們的任何內容。 – delnan 2011-03-27 08:51:14

+0

好的。這是一個可憐的人(在這種情況下)。我已經理解了 – 2011-03-27 08:53:40

3

「對象的名稱」不是對象的固有屬性。 「名稱」是給定上下文中的名稱。當你將一個對象傳遞給一個函數時,你只需傳遞該對象,而不是它所命名的上下文(在你的例子中爲「黑色」)。

無論你想完成什麼,你都走錯了路。

+0

我只是在對象中保留了一些配置,並且我想在其中創建更少的屬性(例如,從名稱獲取「type」屬性,但不從對象屬性獲取類型) – 2011-03-27 09:10:02

3

我想指出你遍歷一個對象的可能性,並遞歸地找到一些屬性的父項的名稱。有了它,你的test功能看起來像:

var test = function(rootobj,propname,rootObjName) { 
    // do smth with object AS rootobj[propname] 
    var objparents = findParents(rootobj,propname,rootObjName); 
} 
test(a,'dark','a'); 

其中findParents是:

function findParents(obj,key,rootName){ 
var parentName = rootname || 'ROOT', result = []; 
function iterate(obj, doIndent){ 
    var parentPrevName = '' 
    for (var property in obj) { 
    if (obj.hasOwnProperty(property)){ 

     if (obj[property].constructor === Object) { 
      parentPrevName = parentName; 
      parentName = property; 
      iterate(obj[property]); 
      parentName = parentPrevName; 
     } 
     if (key === property) { 
       result.push('Found parent for key [' 
          +key+' (value: '+obj[property] 
          +')] => '+parentName); 
     } 

    } 
    } 
} 
iterate(obj); 
return result; 
} 

當然,問題是,物業也不會是唯一的。如在:

var a = 
{ 
    'light': 'good', 
    'dark' : { 
     'black': 'bad', 
     'gray' : 'not so bad' 
     'yellow' : { 
        'dark': 'will do', //<=there's 'dark' again! 
        'light':'never use' 
        } 
    } 
} 

那麼,可能是可用的。你可以找到findParents功能的http://jsfiddle.net/KooiInc/Kj2b9/

+0

因此,您傳入「 「'作爲一個論據來找出很多代碼,」對象的名字「是」黑暗的「......? ;-P – deceze 2011-03-28 00:04:34

+0

不,你通過'黑暗'來找出它的父母的名字。 – KooiInc 2011-03-28 06:18:08

+0

沒有冒犯性,但是將函數設計爲'function(parent,node){var elem = parent [node]; }'? :) – deceze 2011-03-28 06:27:09

3

演示它是可能的:

function loadProps(obj, container) { 
    for (var p in obj) { 
     container.push(p); 
     if (obj[p].constructor == Object) { 
      loadProps(obj[p], container); 
     } 
    } 
} 

則:

var props = []; 
loadProps(a, props); 

console.log(props.join(",")); 
1

var a = { name:'a', 'light': 'good', 'dark' : { name: 'dark', 'black': 'bad', 'gray' : 'not so bad' } }

這樣你就可以做

console.log(a.name,a.dark.name);