Как решить задачу на JS?

Не могу решить задачу помогите пожалуйста.

Напишите функцию get, которая получает объект и путь к вложенному свойству объекта и возвращает значение этого свойства (или undefined, если свойства не существует). Третий, опциональный аргумент функции — значение по умолчанию, которое возвращается, если значения по указанному пути не существует.

function get(obj, path, defaultValue) {
        // your code here
    }
    
    const obj = { 
      a: { 
        b: { 
          c: 'd' 
        },
        e: 'f'
      }
    };
    
    get(obj, 'a.b');   // { c : 'd' }
    get(obj, 'a.b.c'); // 'd'
    get(obj, 'a.e');   // 'f'
    get(obj, 'a.x.e'); // undefined
    get(obj, 'a.x.e', true); // true
    get(obj, 'a.x.e', 'My default value'); // My default value

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

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

ну алгоритм простой

  1. надо разбить строку с путём на элементы по разделителю .

для этого нужно использовать метод split('.'),

например 'a.b.c.d'.split('.') создаст массив ['a', 'b', 'c', 'd']

  1. далее перебираете все элементы данного массива с помощью цикла

     for (index of arr)
    
  2. и итерационно двигаетесь по вашему объекту

     current = current[index]
    
  3. если ключа не существует - вернется undefined и вы вернете значение по умолчанию

в общем всего кода строчек на 5

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

get довольно прост. set сложнее)

в get есть только одна сложность, но вам она не нужна - возможность экранирования '.'

function get(obj, path, defaultValue) {
   const parts = path.split('.');
   let res = obj;
   for (const part of parts) {
     res = res ? res[part] : undefined;
   }
   return res === undefined ? defaultValue : res;
}
    
    const obj = { 
      a: { 
        b: { 
          c: 'd' 
        },
        e: 'f',
        z: false,        
      }
    };
    
    
    console.log(
    get(obj, 'a.b'),   // { c : 'd' }
    get(obj, 'a.b.c'), // 'd'
    get(obj, 'a.e'),   // 'f'
    get(obj, 'a.x.e'), // undefined
    get(obj, 'a.z'), // false
    get(obj, 'a.x.e', true), // true
    get(obj, 'a.x.e', 'My default value')
    )

→ Ссылка