检查 javascript 中是否存在子节点的最佳方法是什么?
What is the best way to check if a child's node exists in javascript?
我很想知道检查子节点是否存在的最佳实践方法是什么。
var object = {}
假设我想访问:object.child.element
它会 return:
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
只有在子节点、元素节点和 foo 节点存在的情况下才会存在。
还有比这更好的模式吗?
在可读性方面绝对不是最佳实践,但我经常使用以下结构(不仅用于节点,而且通常):
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
如果您知道属性名称为字符串,则可以递归检查是否存在。
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);
我很想知道检查子节点是否存在的最佳实践方法是什么。
var object = {}
假设我想访问:object.child.element
它会 return:
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
只有在子节点、元素节点和 foo 节点存在的情况下才会存在。
还有比这更好的模式吗?
在可读性方面绝对不是最佳实践,但我经常使用以下结构(不仅用于节点,而且通常):
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
如果您知道属性名称为字符串,则可以递归检查是否存在。
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);