检查javascript中是否存在子节点的最佳方法是什么?

时间:2015-12-02 16:31:26

标签: javascript standards

我有兴趣知道检查儿童节点是否存在的最佳实践方法是什么。

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节点时才会存在。

是否有比这更好的模式?

2 个答案:

答案 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);