Как получить имя объекта в JavaScript? - PullRequest
7 голосов
/ 27 марта 2011

Например, у меня есть такой объект:

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);

Как получить имя объекта в теле функции. То есть я должен знать, что имя объекта «темный».

Я пытался проверить объект с помощью firebug, но он показывает только свойство объекта. Он не показывает некоторые внутренние методы или свойства, с которыми я смогу узнать

Спасибо.

Ответы [ 5 ]

14 голосов
/ 27 марта 2011

Вы не можете. Вы только передаете объект { black : 'bad', gray : 'not so bad' } в test. Этот объект сам по себе не имеет названия «темный», это просто объект, который, как оказалось, существует как свойство dark объекта a. Эта информация безвозвратно теряется при передаче в функцию.

В основном вы пытаетесь получить имя переменной, которая содержала значение до того, как значение было передано в функцию. Это невозможно.

3 голосов
/ 14 сентября 2012

Возможно с:

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(",") );
3 голосов
/ 27 марта 2011

Я хотел бы указать вам на возможность перебирать объект и рекурсивно находить имя родителя некоторого свойства. При этом ваша 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/

3 голосов
/ 27 марта 2011

«Имя объекта» не является внутренним свойством объекта. «Имя» - это имя в данном контексте. Когда вы передаете объект функции, вы просто передаете этот объект, а не контекст, в котором он был назван («темный» в вашем примере).

Чего бы вы ни хотели достичь, вы на неправильном пути.

0 голосов
/ 31 августа 2015

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

Таким образом, вы можете сделать

console.log(a.name,a.dark.name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...