Javascript — Как ссылаться на вложенные значения объекта, используя массив в качестве ссылки

#javascript

#javascript

Вопрос:

Я создаю некоторые формы, которые должны обрабатывать сущности, которые могут иметь вложенные объекты. Поэтому мне нужно, чтобы интерфейс принимал в качестве ключа поля либо строку, либо массив строк с каждой частью пути к значению (как в примере ниже).

 const obj = {
    name: "John",
    role: {
        id: 1,
        name: "admin"
    }
}

const key1 = 'name'
const key2 = ['role', 'name']

function getValueByKey (key, obj) {

    if (Array.isArray(key)) {
        //Get value if key is array.
    } else {

        return obj[key]
    }
}

console.log(getValueByKey(key1, obj))
//Should output "John"
console.log(getValueByKey(key2, obj))
//Should output "admin"
  

Ответ №1:

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

 function getValueByKey(key, obj) {
    return Array.isArray(key) amp;amp; key.length > 1
        ? getValueByKey(key.slice(1), obj[key[0]])
        : obj[key];
}

const
    obj = { name: "John", role: { id: 1, name: "admin" } },
    key1 = 'name',
    key2 = ['role', 'name'];

console.log(getValueByKey(key1, obj)); // "John"
console.log(getValueByKey(key2, obj)); // "admin"  

Итеративный подход

 function getValueByKey(key, obj) {
    return [].concat(key).reduce((o, k) => o[k], obj);
}

const
    obj = { name: "John", role: { id: 1, name: "admin" } },
    key1 = 'name',
    key2 = ['role', 'name'];

console.log(getValueByKey(key1, obj)); // "John"
console.log(getValueByKey(key2, obj)); // "admin"  

Ответ №2:

Используйте метод get от Lodash. Он делает именно то, что вы хотите.

https://lodash.com/docs/#get

 _.get(obj, 'name');
// => John
 
_.get(obj, "role.name");
// => admin
  

Если вы не можете использовать Lodash напрямую, вы всегда можете посмотреть его реализацию здесь; он настолько проверен и проверен, насколько это возможно.