@1233211

Как правильнее всего достать значение объекта при помощи строки?

Есть объект
{ a: { b: { c: 3 } }, c: 1, b: 1 }
и строка
'a.b.c'
нужно из объекта с помощью этой строки достать '3'.
  • Вопрос задан
  • 150 просмотров
Решения вопроса 3
contraomnes
@contraomnes
Frontend developer
const nestedObject = { a: { b: { c: 3 } }, c: 1, b: 1 };
const str = "a.b.c";

const prop = str
  .split(".")
  .reduce(
    (acc, current) => (acc[current] !== undefined ? acc[current] : acc),
    nestedObject
  );
console.log(prop);

если str будет другой, например, 'a.b.c.d', то вернет максимально глубокое значение, т.е. в данном случае `c`, которое равно 3
Ответ написан
Комментировать
Aetae
@Aetae Куратор тега JavaScript
Тлен
Использовать lodash get.
Если интересует код - смотрите исходники.
Писать велосипед не рекомендуется, можно наступить на грабли и не раз.
Ответ написан
Комментировать
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Не знаю как правильнее, но с ходу вижу 2 варианта:

первый, и точно не очень правильный, но возможно самый быстрый и простой
var obj = { a: { b: { c: 3 } }, c: 1, b: 1 };
var str = 'a.b.c';
var value = eval('obj.'+str);


второй выглядит както так
var obj = { a: { b: { c: 3 } }, c: 1, b: 1 };
var value = getPath(obj,'a.c');


function getPath(object, keyPath){
    if( typeof keyPath === 'string' ) keyPath = keyPath.split(/\./);
    if( !Array.isArray(keyPath) ) return undefined;
    let key = keyPath.shift();
    if( !key) return object;
    if( !object.hasOwnProperty(key) ) return undefined;
    if( keyPath.length === 0 ) return object[key];
    return getPath(object[key],keyPath);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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