Javascript точка обозначения с переменной - PullRequest
4 голосов
/ 24 декабря 2011

Не знаю, как это выразить.

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

var target = "level1.level2.var";
var myObject = {
                    level1: {
                        level2: {
                            var: 'value'
                        }  
                    }
               }
var returnVal = myObject.target;

Как это можно сделать? Очевидно, это не сработает. Возможен ли другой путь?

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

Ответы [ 5 ]

9 голосов
/ 24 декабря 2011

Вы можете использовать эту функцию:

function get_property_from_target(obj, target){
    var arr = target.split('.');
    for(var i = 0; i < arr.length; i++){
        if(obj)
            obj = obj[arr[i]];
    }
    return obj;
}

Тогда назовите это как:

get_property_from_target(myObject, target);

Я бы тоже переименовал функцию во что-то лучшее.

Также, пожалуйста, не называйте объектное свойство var, поскольку это ключевое слово в Javascript, оно может сбивать с толку, и я не уверен, что оно всегда будет работать так, как вы ожидаете, или если оно просто вызовет ошибки некоторые браузеры.

4 голосов
/ 24 декабря 2011

Легче?Конечно, используйте eval:

var obj = eval('myObject.' + target);

Хотя это не очень серьезный ответ.Вы не должны использовать eval таким образом в хорошем коде.Однако, насколько я знаю, единственный другой способ - выполнить цикл, как вы описываете:

var items = target.split('.');
var obj = myObject;
var i;

for(i = 0; i < items.length; i++) {
    obj = obj[items[i]];
}

Или с помощью хака с регулярным выражением:

var obj = myObject;
target.replace(/[^\.]+/g, function(m) {
    obj = obj[m];
});

Независимо от того, вы можете теперьиспользуйте obj.

2 голосов
/ 24 декабря 2011

Я вижу два способа сделать это:

  • Использование eval() (нахмурился, поскольку eval равно evil):

    var returnVal = eval('myObject.' + target);
    
  • Использование цикла:

    var split = target.split('.');
    var newTarget = myObject;
    
    for (var i = 0; i < split.length; i++) {
        newTarget = newTarget[split[i]];
    }
    
1 голос
/ 24 декабря 2011

Что бы я сделал (может быть, не самый лучший, но это сработает), это то, что вы предложили.Разбейте переменную и перейдите на этот уровень.

var target = "level1.level2.var";
target = target.split('.');

var returnVal = myObject;
for(var i=0,len=target.length; i<len; i++){
    returnVal = returnVal[target[i]];
}

console.log(returnVal); // value
1 голос
/ 24 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...