let absentKeys = [];
let keys = [ 'test', 'user.name', 'article.author.name' ];
function isHasPropertyChain(obj, propertyChain){
if(!(obj instanceof Object)) throw new TypeError("obj должен быть объектом");
if((!(propertyChain instanceof Array)) && (!(typeof(propertyChain) === 'string'))) throw new TypeError("propertyChain должен строкой или массивом");
var properties = (propertyChain instanceof Array)
? propertyChain
: propertyChain.split('.');
if (properties.length == 0) return false;
var testedProp = properties[0];
var res = (testedProp in obj);
if(res){
if((properties.length > 1)){
return (obj[testedProp] instanceof Object) && isHasPropertyChain(obj[testedProp], properties.splice(1));
}
}
return res;
}
function predicator(v){
return !isHasPropertyChain(this, v);
}
var obj = {/* тестируемый объект */};
absentKeys = keys.filter(predicator, obj);