Разбейте путь по точкам и последовательно переходите по свойствам, прерываясь при отсутствии очередного звена. Для безопасного контракта проверяйте собственные свойства.
Получение значения вложенного свойства по строковому пути
Разбейте путь по точкам и последовательно переходите по свойствам, прерываясь при отсутствии очередного звена. Для безопасного контракта проверяйте собственные свойства.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать функцию, которая извлекает значение из вложенного объекта, используя путь, представленный строкой с точками. Если указанного пути нет в объекте, функция должна вернуть undefined.
<script>
function getProp(obj, path) {
//code...
}
const obj = {
a: {
b: 10,
c: {
d: {}
}
}
};
getProp(obj, 'a.b'); // => 10
getProp(obj, 'a.c.d'); // => {}
getProp(obj, 'a.c.z.f.s'); // => undefined
</script>
Ответ
Разбейте путь по точкам и последовательно переходите по свойствам, прерываясь при отсутствии очередного звена. Для безопасного контракта проверяйте собственные свойства.
function getProp(obj, path) {
if (typeof path !== 'string' || path === '') return undefined;
let current = obj;
for (const key of path.split('.')) {
if (current == null || !Object.prototype.hasOwnProperty.call(current, key)) return undefined;
current = current[key];
}
return current;
}
Ноль, false и пустая строка не считаются отсутствующими. Имена ключей с точкой и bracket-нотация здесь не поддерживаются. Чтение getter может выполнить код, поэтому это не sandbox для произвольных объектов.