2011-03-27 46 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);