Javascript 如何检查';未定义';对象链中的任何位置?
我想检查复杂对象链中是否缺少任何对象。 我提出了以下解决方案,有没有更好的方法来达到同样的效果Javascript 如何检查';未定义';对象链中的任何位置?,javascript,undefined,Javascript,Undefined,我想检查复杂对象链中是否缺少任何对象。 我提出了以下解决方案,有没有更好的方法来达到同样的效果 var lg = console.log; var t = { a:{a1: 33, a12:{ aa1d: 444, cc:3 } }, b:00}; var isDefined = function(topObj, propertyPath) { if (typeof topObj !== 'object') { throw new Error('First argumen
var lg = console.log;
var t = { a:{a1: 33, a12:{ aa1d: 444, cc:3 } }, b:00};
var isDefined = function(topObj, propertyPath) {
if (typeof topObj !== 'object') {
throw new Error('First argument must be of type \'object\'!');
}
if (typeof propertyPath === 'string') {
throw new Error('Second argument must be of type \'string\'!');
}
var props = propertyPath.split('.');
for(var i=0; i< props.length; i++) {
var prp = props[i];
lg('checking property: ' + prp);
if (typeof topObj[prp] === 'undefined') {
lg(prp + ' undefined!');
return false;
} else {
topObj = topObj[prp];
}
}
return true;
}
isDefined(t, 'a.a12.cc');
var lg=console.log;
var t={a:{a1:33,a12:{aa1d:444,cc:3},b:00};
var isDefined=函数(topObj,propertyPath){
if(地形类型!==“对象”){
抛出新错误('第一个参数的类型必须为'object\'!');
}
if(typeof propertyPath=='string'){
抛出新错误('第二个参数的类型必须为'string\'!');
}
var props=propertyPath.split('.');
对于(变量i=0;i
您的概念还可以,但代码必须更改。当属性具有null
值时,它不能有任何属性。尝试访问null
上的属性会导致错误。要解决此问题,请使用:
for (var i=0; i<props.length; i++) {
var prp = props[i],
val = topObj[prp];
lg('checking property: ' + prp);
if (typeof val === 'undefined') {
lg(prp + ' undefined!');
return false;
} else if (val === null) {
return i === props.length-1; // True if last, false otherwise
} else {
topObj = val;
}
}
for(var i=0;i您可以更简单地定义函数,如下所示:
var isDefined = function(value, path) {
path.split('.').forEach(function(key) { value = value && value[key]; });
return (typeof value != 'undefined' && value !== null);
};
关于的工作示例。保持理论中所学的简单。尝试/捕获自定义函数中引发的异常
let obj1 = {
x: {
y: 10
}
};
export function def(chain){
try{
let lookup = eval(chain);
return true;
} catch (e){
return false;
}
}
//true
document.write(def('obj1.x.y'));
//false (at any moment in the given chain)
document.write(def('obj1.k.v'));
@Felix的可能重复问题不是重复问题。重复问题不考虑从原型链继承属性。@RobW:这不是要求的,很容易更改。整体方法不会更改。@krul另一个问题:不要使用var lg=console.log;
这会破坏Chrome。使用var lg=console.log、 bind(console);
相反,它保留了console.log的上下文。Rob W,谢谢,我知道,但我没有注意,无论如何,谢谢。