Вы можете использовать reduce
, чтобы получить значение.Во-первых, вам нужно разделить путь на .
:
function inspector(obj){
return function fun (prop){
return prop.split(".").reduce(function(o, p) { // for each part p in prop.split(".")
return o && o[p]; // if o is an object truthy return o[p]
}, obj); // pass obj as the initial o
}
}
Тест o &&
очень прост.Если вы хотите использовать индекс o
тогда и только тогда, когда o
является объектом, замените эту строку на:
return (o && typeof o === "object")? o[p]: undefined;
, которая возвращает o[p]
, если o
является объектом, в противном случае undefined
.
Пример:
function inspector(obj){
return function fun (prop){
return prop.split(".").reduce(function(o, p) {
return (o && typeof o === "object")? o[p]: undefined;
}, obj);
}
}
var obj = {
s : 'a',
n : 1,
d : new Date(),
f : function(){},
a : [],
o : {
a : {
b: 'b'
}
}
};
var ins = inspector(obj);
console.log('s:', ins('s')); // -> a
console.log('n:', ins('n')); // -> 1
console.log('d:', ins('d')); // -> 2018-12-06T11:51:26.244Z
console.log('f:', ins('f')); // -> [Function]
console.log('a:', ins('a')); // -> []
console.log('o:', ins('o')); // -> { a: { b: 'b' } }
console.log('o.a:', ins('o.a')); // -> { b: 'b' }
console.log('o.a.b:', ins('o.a.b')); // -> b
console.log('o.p:', ins('o.p')); // -> undefined
console.log('o.p.p:', ins('o.p.p')); // -> undefined
console.log('p:', ins('p')); // -> undefined
console.log(':', ins('')); // -> undefined