在“if”条件下检查嵌套对象的更好方法
Better way for checking nested object in `if` condition?
考虑我有一个这样的对象:
Obj.Boo.Foo.Zoo
好的,如果我想确定zoo
有一个值并且不是空的,我应该这样做:
if(Obj != null && Obj.Boo != null && Obj.Boo.Foo != null && Obj.Boo.Foo.Zoo != null) {
//blah blah
}
如果在Zoo
之后有更多嵌套对象,我应该扩展if
,代码就会变得有点格式错误。
有没有更好的方法来解决这种情况?
我保留了一个调用chainGet(obj, chain, default)
的小函数,用于以下情况:
function chainGet(obj, chain, dflt) {
if (typeof chain === "string")
chain = chain.split(".");
var result = obj;
for (var i = 0; i < chain.length; i += 1) {
if (result === undefined)
break;
result = result[chain[i]];
}
return result === undefined? dflt : result;
}
例如:
> chainGet({ foo: 42 }, "foo")
42
> chainGet({ foo: 42 }, "bar", "x")
'x'
> chainGet({ foo: { bar: 42 }}), "foo.bar")
42
这甚至适用于阵列:
> chainGet([{ foo: [42] }], [0, "foo", 0])
42
当然,长链的点式访问是一种代码气味,所以在使用它们时应该谨慎……但有时你只需要这样做;)
如果你真的不需要处理这样的情况,一个糟糕的做法是尝试在try-catch语句中访问对象
try{
// access Obj.Boo.Foo.Zoo
}
catch{
// catch a NullReferenceException
}
更好的方法是修改getter和setter,以便父对象在尝试访问子对象及其null时抛出合适的异常或处理此异常。在这种情况下,检查第一个对象就足够了。
它可以在不使用函数的情况下实现。快捷方式可以是-
if(((((Obj || {}).Boo || {}).Foo || {}).Zoo || {}) != {}) {
// Zoo has a value and not empty
}
或者ES6方式-
const checkNull = (keys, Object) =>
keys.reduce((Obj, o) =>
(Obj && Obj[o]) ? Obj[o] : null, Object)
console.log(checkNull(['Boo', 'Foo', Zoo], Obj))
// [Value of Zoo]
console.log(checkNull(['Boo', 'Foo1', Zoo], Obj))
// null
相关文章:
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 设置嵌套对象属性的更好方法
- 我应该如何将响应数据保存在对象(json)中以获得更好的操作和性能
- 在Knockoutjs中设置计算对象的observableArray的更好方法
- 在速度方面,使用变量而不是重新定义jquery对象更好吗
- 更快/更好:使用PHP或JavaScript获取一些JSON对象
- 将对象完全转换为键和值的数组:更好的解决方案
- Javascript;Ajax——填充对象的更好方法
- 是将连接对象传递给模块更好,还是在模块本身内连接更好
- 更好的设计,以便从对象的方法引用自己的对象的属性
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- 在实例化时检查视频.js对象的更好方法
- 为什么将 JSON 对象存储在 cookie 中比字符串更安全或更好
- 有没有更好的方法来处理这个对象
- 组织对象原型的更好方法是什么
- 如何更好地检查 javascript 中的参数对象
- 更好的JavaScript对象初始化
- 对象不为 null,也不未定义.更好的是 - 双重反转'!!' 或 JavaScript 中的严格等价性 '!=='
- 通过JavaScript中的dictionary对象检查单词的有效性-是否有更好的方法来引用/构建词典
- 与许多事件侦听器和函数引用一个对象相比,什么是更好的方法