例如我有这样一个对象:
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检查对象,但它只显示对象的属性。它没有显示一些内部方法或属性,我将能够知道
谢谢。
答案 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);