Значит, на вход подается строка, где через точку перечислен путь к вложенному свойству, и объект:
f( "a.goal", x)
Можно сделать через рекурсию. На каждом «шаге» функция путь обрабатывает самый левый кусок цепочки. Для "a.goal" это будет "a". Нужно проверить, есть ли такое свойство у объекта. И если есть, то вернуть вызов этой же функции, но цепочка уже короче, остается только "goal" и объект не
x
, а
x.a
:
var x = {
a: {
goal: 1,
b: 2,
},
c: 3
};
function f(value, chain) {
if(chain.length === 0) return value;
const propsArray = chain.split('.'); // "a.goal" => ["a", "goal"]
const property = propsArray[0];
if(!value.hasOwnProperty(property)) return; // несуществующее свойство
return f(value[property], propsArray.slice(1).join('.')); // вызыв функцией самой себя
// но цепочка свойств короче на 1 элемент – самый левый отрезали
}
console.log( "Result:", f(x, 'a.goal')); // 1