Задать вопрос

Как достать значение из вложенных объектов, имея массив ключей?

Имеется задача:
Реализуйте функцию getIn, которая извлекает из объекта (который может быть любой глубины вложенности) значение по указанным ключам. Аргументы:

Исходный объект
Массив ключей, по которым ведется поиск значения
В случае, когда добраться до значения невозможно, возвращается null.

Примеры:
const data = {
  user: 'ubuntu',
  hosts: {
    0: {
      name: 'web1',
    },
    1: {
      name: 'web2',
      null: 3,
    },
  },
};

getIn(data, ['undefined']);        // null
getIn(data, ['user']);             // 'ubuntu'
getIn(data, ['user', 'ubuntu']);   // null
getIn(data, ['hosts', 1, 'name']); // 'web2'
getIn(data, ['hosts', 0]);         // { name: 'web1' }
getIn(data, ['hosts', 1, null]);   // 3

Решение:
https://repl.it/repls/AttentiveBusyPetabyte?timeTo...

И я хочу, чтобы в result по итогу была эта цепочка:

result = data['hosts'][1]['name']; // 'web2'

Как это сделать?
  • Вопрос задан
  • 4304 просмотра
Подписаться 3 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
const getNested = (obj, ...keys) => keys
  .flat(Infinity)
  .flatMap(n => typeof n === 'string' ? n.split('.') : n)
  .reduce((p, c) => p?.[c] ?? null, obj);

getNested(data, [ 'hosts', 1, null ]) // 3
getNested(data, 'hosts', 0) // {name: 'web1'}
getNested(data, 'hosts.0.name.2') // 'b'
getNested(data, [ 'user', 'xxx' ]) // null
getNested([], 'constructor.prototype', [[['slice']]], ['name.length']) // 5
Ответ написан
@sabir01
export default function findKey(obj, keys) {
    let result = obj;
    for (const key of keys) {
      if (Object.hasOwn(result, key) === false) {
        return null;
      } else {
        result = result[key];
      }
    } return result;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы