Нужна помощь. Не понимаю как исправить проблему. Почему на 3-ем и 4-ом вызове функции массив из значений после 2-го прохода превращается в undefined?

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

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

function optionalChaining(obj, chain) {
    if (Object.keys(obj) == chain[0] && chain.length == 1) {
        return obj[chain[0]]
    } else if (chain.length != 1) {
        return optionalChaining(obj[chain[0]], chain.slice(1))
    } else
        return undefined
}

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

console.log(optionalChaining(obj2, ["a", "b", "name"])) // Pavel
console.log(optionalChaining(obj, ["a", "b", "c", "name"])) // undefined
console.log(optionalChaining(obj, ["z", "c", "d"])) // undefined
console.log(optionalChaining(obj2, ["z", "c", "d"])) // undefined

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

Автор решения: Павел Артамонов

Object.keys(obj) == chain[0] неподходящее сравнение, правильнее obj.hasOwnProperty(chain[0]). Не было проверки на undefined с возвратом его же самого. Правильный код:

    if (obj.hasOwnProperty(chain[0]) && chain.length == 1) {
        return obj[chain[0]]
    }
    else if (!obj.hasOwnProperty(chain[0])) {
        return undefined
    }
    else (chain.length != 1)
    return optionalChaining(obj[chain[0]], chain.slice(1))
}
→ Ссылка