如何在javascript中获取对象的名称?

时间:2011-03-27 08:41:16

标签: javascript object

例如我有这样一个对象:

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的名字是“黑暗的”。

我尝试用firebug检查对象,但它只显示对象的属性。它没有显示一些内部方法或属性,我将能够知道

谢谢。

5 个答案:

答案 0 :(得分:13)

你不能。您只是将对象{ black : 'bad', gray : 'not so bad' }传递给test。此对象本质上没有名称" dark",它只是一个碰巧作为对象dark的属性a存在的对象。将此信息传递给函数时,此信息将无法恢复。

你基本上试图在值传递给函数之前检索保存值的变量名。这是不可能的。

答案 1 :(得分:3)

“对象的名称”不是对象的固有属性。 “名称”是给定上下文中的名称。将对象传递给函数时,只需传递该对象,而不是传递它的上下文(在示例中为“dark”)。

无论你想做什么,你都走错了路。

答案 2 :(得分: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'
                   }
    }
}

嗯,可能是可用的。您可以在http://jsfiddle.net/KooiInc/Kj2b9/

中找到findParents函数的演示

答案 3 :(得分: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(",") );

答案 4 :(得分:0)

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

这样你可以做到

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