Обращение к объекту в объекте через его полный адрес, переданный в строке

Есть объект:

let obj = {a:{b:{c:10}}};

Получить значение c можно через

obj["a"]["b"]["c"];
obj.a.b.c;

Есть ли возможность обратиться к c через что-то вроде этого obj["a.b.c"] ?


Ответы (2 шт):

Автор решения: Денис Степанов

let obj = {a: {b: {c: 10}}};

function get(obj, path, defaultVal) {
  return path.split(".").reduce((acc, prop) => (acc && prop !== "" ? acc[prop] : acc), obj) || defaultVal
}

console.log(get(obj, "", "defaultValue"));
console.log(get(obj, "a.b"));
console.log(get(obj, "a.b.c"));

console.log(get(obj, "c.a.c", "defaultValue"));




obj.get = get.bind(null, obj);

console.log(obj.get(""));
console.log(obj.get("a.b"));
console.log(obj.get("b", "defaultValue"));

function get(path, defaultVal) {
  return path.split(".").reduce((acc, prop) => (acc && prop !== "" ? acc[prop] : acc), this) || defaultVal
}

Object.prototype.get = Object.prototype.get || get;

let obj = {a: {b: {foo: "foo"}, boo: "boo"}}

console.log(obj.get("a.b.foo"));
console.log(obj.get("a.boo"));
console.log(obj.get("a.boo.foo", "default value"));

→ Ссылка
Автор решения: Kopkan
    Object.prototype.setByPath = function (keys, value, createTree=true){

        let object = this;
        if(typeof keys === 'string'){ keys = keys.split('.')}
        while(keys.length > 1){
            let key = keys.shift();
            if(createTree && !object[key]){ object[key] = new Object; } 
            object = object[key];
        }
        return object[keys.shift()]=value;
    }

    Object.prototype.getByPath = function (keys, defValue){

        let object = this;
        if(typeof keys === 'string'){ keys = keys.split('.')}
        while(keys.length > 1 && object){
            object = object[keys.shift()];
        }
        if(!object){return defValue;}
        return object[keys.shift()];
    }


let obj = {a: {b: {c: 10}}};
obj.setByPath("a.b.c", 15);
console.log(obj.getByPath("a.b.c"));
→ Ссылка