Как написать метод объекта в JavaScript для получения значений по ключам в виде строки
Что проверяют
Работу с this, умение разобрать строку в путь и аккуратность с граничными случаями: отсутствующий ключ, null посередине пути, ложные значения. Следом обычно просят поддержать индексы массивов вида a.items[0].name или написать парный set.
Как отвечать
Сначала уточните постановку. Чаще всего имеется в виду аналог get из lodash: путь приходит строкой через точку, например user.address.city, а метод возвращает вложенное значение.
const obj = {
data: { user: { address: { city: 'Казань' } } },
getByPath(path, fallback) {
const keys = path.replace(/\[(\d+)\]/g, '.$1').split('.');
const value = keys.reduce((acc, key) => acc?.[key], this);
return value === undefined ? fallback : value;
},
};
obj.getByPath('data.user.address.city'); // 'Казань'Что проговорить:
- сокращённая запись метода или
function, но не стрелка: у стрелочной функции нет своегоthis, и она увидит внешний контекст; - опциональная цепочка
?.: не падает наnullиundefinedпосередине пути; - проверка через
=== undefinedили??, а не||: иначе значения0,''иfalseподменятся дефолтом; - собственные ключи: если важно отличать свои свойства от унаследованных, берите
Object.hasOwn(obj, key), он надёжнееobj.hasOwnProperty(key).
Если имелся в виду список ключей и результат строкой, это одна строка: keys.map((k) => this[k] ?? '').join(', '). Хорошо, если вы сами назовёте обе трактовки.
Где спотыкаются
Пишут метод стрелкой прямо в литерале объекта. this внутри указывает не на объект, и метод возвращает undefined на любой путь.
Добавляют метод в Object.prototype, чтобы он был «у всех объектов». Это ломает перебор for...in в чужом коде и считается грубой ошибкой.
Разбирают путь через eval или new Function. Решение короче на строку, но открывает выполнение произвольного кода из входных данных.