我有兴趣知道检查儿童节点是否存在的最佳实践方法是什么。
var object = {}
我想说我想访问:object.child.element
它会返回:
Uncaught TypeError: Cannot read property 'element' of undefined
因为child
未定义。
我可以先检查每个节点是否已定义:
if (object.child) {
object.child.element
}
所以这会避免TypeError
object.child
应该是undefined
但是如果我们说5个元素,那么拥有所有这些if语句将不是一个可行的解决方案。
所以我倾向于将该地块包裹在try
。
try {
var test = object.child.element.foo.bar;
} catch (error) {
console.log(error);
}
所以test
只有在存在child,element和foo节点时才会存在。
是否有比这更好的模式?
答案 0 :(得分:2)
绝对不是可读性方面的最佳实践,但我经常使用以下结构(不仅仅是节点,而且通常):
if (object.child && object.child.element)
在此处查看:
var a = {};
var b = {"child": {}};
var c = {"child": {"element": "finally"}};
console.log(a.child && a.child.element);
console.log(b.child && b.child.element);
console.log(c.child && c.child.element);

随着嵌套越多,代码越来越差,所以你最终会得到一些丑陋的东西:
object && object.child && object.child.element && object.child.element.another...
但是,好的方面是它也可以很好地处理作业:
var obj = {"child": 123};
var other = obj && obj.child; // 123
答案 1 :(得分:0)
如果您知道属性的名称为字符串,则可以递归检查是否存在。
var properties = ["child", "element", "foo", "bar"];
var i = 0;
var test = obj;
while(i < properties.length && !!test[properties[i]]) {
test = test[properties[i++]];
}
if(i === properties.length) console.log("success", test);