Поиск вложенных объектов в Javascript, из строки, без eval? [Дубликат]

0

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

Схема документа также неизвестна во время разработки, поэтому это должно быть полностью гибким.

eval() делает то, что я хочу, но я выполняю свою должную осмотрительность, чтобы увидеть, есть ли другой способ.

var obj = {"a": {"b": {"c": 42}, "d": [8,9]}}
var path = 'a.b.c';
eval('obj.' + path);
42

Кто-нибудь знает способ, без "eval", чтобы я мог использовать строку "abc", чтобы найти это вложенное значение в obj?

Это также должно поддерживать индексы в списках:

var path = 'a.d[1]';
eval('obj.' + path);
9

Я могу использовать jQuery, если он предлагает жизнеспособное решение, я просто не вижу ничего очевидного.

Благодарю!

  • 1
    Ну да, это легко (иш). Разобрать путь, затем получить доступ к свойствам, используя скобочные обозначения.
  • 0
    @JonathanLonowski: Мне нравится функция Object.byString из этого вопроса :-)
Показать ещё 1 комментарий
Теги:

1 ответ

2

Рекурсия - это решение здесь.

function getVal(path, obj){
    if(path.length === 1){
        return obj[path[0]];
    }
    else{
        return getVal(path, obj[path.shift()]);
    }
}

var obj = {"a": {"b": {"c": 42}, "d": [8,9]}};
var path = 'a.b.c';

var val = getVal(path.split('.'), obj);
console.log(val);

Это даст вам 42. Он пока не работает с 'ad[1]', но его можно добавить.

UPDATE: здесь обновленная версия, которая работает с 'ad[1]'.:

function getVal(path, obj){
    // Get the next "key" in the stack
    var key = path.shift();

    // Check for bracket notation
    if(key.indexOf('[') > -1){
        var match = key.match(/(\w+)\[(\d+)\]/);
        if(match !== null){
            // Get the "next" key
            key = match[2];
            obj = obj[match[1]];
        }
    }

    // Return the value if done, otherwise, keep going
    return path.length === 0 ? obj[key] : getVal(path, obj[key]);
}

var obj = {"a": {"b": {"c": 42}, "d": [8,9]}};
var path = 'a.d[1]';

var val = getVal(path.split('.'), obj);
console.log(val);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню