1 (изменено: sand123, 2020-04-19 13:15:56)

Тема: JS: безопасное получение вложенного свойства объекта

Иногда нужно получить свойство объекта на N+1 уровне вложенности, даже если структура не гарантирована.

Добавляем метод в прототип


if(!Object.prototype.deep){
    Object.prototype.deep = function(path, defaultValue, src){
        var chunks = path.split("."),
            root = src || this,
            i,
            index,
            chunk;
        for(i=0; i< chunks.length;i++){
            chunk = chunks[i];
            if(root.hasOwnProperty(chunk)){
                root = root[chunk];
            } else {
                if(chunk.indexOf("[") > -1 && Object.prototype.toString.call(root) === '[object Array]'){
                    index = parseInt(chunk.replace("[","").replace("]",""),10);
                    if(root[index] === undefined) {
                        return defaultValue;
                    };
                    root=root[index];
                } else {
                    return defaultValue;
                }
            }
        };
        return root;
    };
};

Теперь можно получать свойство с возвращением дефолтного значения, если оно не существует


var object1 = {
	states: [{
		name: "Alyaska",
		population: {
			year2019: 100500
		}
	}]
};

/* по существующему пути до свойства */
WScript.Echo(object1.deep("states.[0].population.year2019"), -1); /* -> 100500*/

/* дефолтное значение */
WScript.Echo(object1.deep("states.[1].population.year2018"),-1); /* -> -1*/