Рекурсия, многомерный объект помогите как решить задачу

Напишите функцию, которая принимает первым параметром объект, вторым - массив из цепочки свойств, по которому нужно пройти, чтобы получить значение.

Если какое-то из свойств не найдено - функция возвращает undefined

const obj = {
  a: {
    b: {
      c: {
        d: 'Привет!'
      }
    }
  }
}
function optionalChaining (obj, chain) {
  //code here
}

optionalChaining(obj, ["a", "b", "c", "d"]) // Привет

Ответы (2 шт):

Автор решения: Grundy

Задачу можно свести к следующим действиям:

  1. если нет текущего объекта - возвращаем undefined
  2. если в пути только один элемент - возвращаем значение по указанному свойству
  3. вызываем рекурсивно функцию, передавая в качестве первого параметра значение свойства, а в качестве второго - массив без первого элемента.

Например:

const obj = {
  a: {
    b: {
      c: {
        d: 'Привет!'
      }
    }
  }
}
console.log(optionalChaining(obj, ["a", "b", "c", "d"])); // Привет

function optionalChaining(o, path) {
  if (!o) return undefined;

  if (path.length == 1) return o[path[0]];

  return optionalChaining(o[path[0]], path.slice(1));
}

→ Ссылка
Автор решения: Igor

function optionalChaining (obj, chain) {
  var i = 0;
  while (typeof obj != 'undefined' && i < chain.length)
    obj = obj[chain[i++]];
  return obj;
}

const obj = {
  a: {
    b: {
      c: {
        d: 'Привет!'
      }
    }
  }
};

console.log(optionalChaining(obj, ["a", "b", "c", "d"]));
console.log(optionalChaining(obj, ["a", "b", "c"]));
console.log(optionalChaining(obj, ["a", "b", "e"]));

→ Ссылка