Ответ 1
Как насчет link: 'tree.options[0].options[0]'
, затем eval(path.to.link)
?
Следующие образцы были протестированы только с помощью Chrome. Это же дерево для всех:
var tree = { level1: [{ key: 'value' }] };
Нет eval
function resolve(root, link) {
return (new Function('root', 'return root.' + link + ';'))(root);
}
var value = resolve(tree, path.to.link);
Возврат к window
function resolve(root, link) {
return (new Function(
'root', 'return root.' + (link || root) + ';'
))(link ? root : window);
}
resolve(tree, 'level1[0].key'); // "value"
resolve('tree.level1[0].key'); // "value"
Ошибки улавливания
Блок try/catch предотвращает ошибочные ошибки от ошибок.
function resolve(root, path) {
try {
return (new Function('root', 'return root.' + path + ';'))(root);
} catch (e) {}
}
resolve(tree, 'level1[0].key'); // "value"
resolve(tree, 'level1[1].key'); // undefined
Использование пользовательского формата пути
Хорошая часть здесь состоит в том, что мы можем передать либо объект, либо массив как root
. Также обратите внимание, что мы можем заменить косую черту в path.split('/')
любым char по нашему выбору.
function resolve(root, path) {
path = '["' + path.split('/').join('"]["') + '"]';
return (new Function('root', 'return root' + path + ';'))(root);
}
resolve(tree.level1, '0/key'); // "value"
resolve(tree, 'level1/0/key'); // "value"
resolve(tree, 'level1/0'); // Object {key: "value"}