Цикл по многомерному объекту JavaScript

Есть задача:

const get = (obj, path) => {

};

console.log(get({ a: 1 }, "a"));// === 1 true
console.log(get({ a: { b: 1 } }, "a.b")); // === 1 true
console.log(get({ a: { b: 1 } }, "a.c")); //  === undefined
console.log(get({ a: { b: { c: 1 } } }, "a.c.b") ); // === null
console.log(get({ a: { b: { c: 1 } } }, "a.b.c") ); // === true

Нужно написать функцию get, которая будет принимать объект и путь и в случае если все передано верно возвращать true, иначе false, если такого пути нет undefined, а если в путь передан не в той последовательности - null. Проблема в том, что здесь вложенные друг в друга объекты, если их определенное количество (напр. 3), то я эту задачу решила вложенными циклами (хоть громоздко,но работает), но эта функция должна работать с любым уровнем вложенных объектов. Спасибо!


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

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

Может можно и проще как то:

const get = (obj, path) => {

 path = path.split('.');

 let curObj = obj;
 let pathDump = ''
 for ( let i = 0 ; i < path.length ; i++){
 
   let key  = Object.keys(curObj)[0]
   pathDump += key;
   curObj = curObj[key]; 
   
 }

 return pathDump == path.join('') || (path.every(i => pathDump.includes(i)) ? null : undefined)
};


console.log('res:' , get({ a: 1 }, "a"));// === 1 true
console.log('res:' , get({ a: { b: 1 } }, "a.b")); // === 1 true
console.log('res:' , get({ a: { b: 1 } }, "a.c")); //  === undefined
console.log('res:' , get({ a: { b: { c: 1 } } }, "a.c.b") ); // === null
console.log('res:' , get({ a: { b: { c: 1 } } }, "a.b.c") ); // === true

→ Ссылка