Тема: 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*/