【发布时间】:2018-12-02 09:10:25
【问题描述】:
我正在寻找一些好的策略来避免在 JavaScript 中使用点表示法来调用可能存在或可能不存在的对象中的子代的子代。
下面代码 sn-p 的底部是一个可行的解决方案示例,但不优雅(充其量)。
很高兴看到一些原生 JavaScript 解决方案甚至外部库可以帮助避免此类错误。
const object1 = {
foo: {
bar: {
baz: 'payload'
}
}
};
const object2 = {};
const array = [object1, object2];
// this will fail on object2 because obj.foo is undefined
array.forEach(obj => {
if (obj.foo.bar.baz) {
console.log(obj.foo.bar.baz);
} else {
console.log('undefined');
}
}
);
// this will work, but it's horrible to write all those nested if statements.
array.forEach(obj => {
if (obj) {
if (obj.foo) {
if (obj.foo.bar) {
if (obj.foo.bar.baz) {
console.log(obj.foo.bar.baz);
}
}
}
} else {
console.log('undefinded');
}
}
);
【问题讨论】:
-
为什么不抓住它,然后做任何你想做的事情,而不是对所有事情都使用 if 语句?
-
@chevybow 我的例子可能过于笼统。我写了很多 JSX,所以我经常使用三元运算符。在这种情况下,Try/Catch 不是一个选项,所以我一直在寻找一种功能性方法。
-
如果
console.log(obj?.foo?.bar?.baz)看起来更优雅,请参阅github.com/tc39/proposal-optional-chaining -
@Aprillion 这是一个很好的解决方案!我认为第 1 阶段对于我的团队来说太远了,但无法舒适地使用 Babel 插件。你知道函数式方法吗?
-
This 你可能会感兴趣
标签: javascript javascript-objects