Имейте ситуацию, когда мне предоставляется путь от внешнего источника, и мне нужно вытащить этот ключ из объекта и вернуть значение.
Схема документа также неизвестна во время разработки, поэтому это должно быть полностью гибким.
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, если он предлагает жизнеспособное решение, я просто не вижу ничего очевидного.
Благодарю!
Рекурсия - это решение здесь.
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);
Object.byString
из этого вопроса :-)