javascript 忽略-if-null 运算符?
javascript ignore-if-null operator?
在javascript中我有很多这样的代码。
if (ctrl && ctrl.main && ctrl.main.user) {
SetTheme(ctrl.main.user.theme);
}
太长了。在其他语言中,您可以简单地做到
SetTheme(ctrl?.main?.user?.theme);
在 javascript 中有什么方法可以做到这一点吗?
我试过了,
function safeGet(a,b) { return a ? a[b] : null; }
和
SetTheme(safeGet(safeGet(safeGet(ctrl, 'main'), 'user'), 'theme'));
但这不是很可读。
您可以创建一个通用函数来执行此操作,方法是将表示到您想要的嵌套 属性 的路径的字符串传递给它:
function getValue(object, prop, /*optional*/ valIfUndefined) {
var propsArray = prop.split(".");
while(propsArray.length > 0) {
var currentProp = propsArray.shift();
if (object.hasOwnProperty(currentProp)) {
object = object[currentProp];
} else {
if (valIfUndefined) {
return valIfUndefined;
} else {
return undefined;
}
}
}
return object;
}
然后在任何对象上使用它,例如:
// This will return null if any object in the path doesn't exist
if (getValue(ctrl, 'main.user', null)) {
// do something
}
正确的捷径可能是
if (((ctrl || {}).main || {}).user) { // ...
或者您可以使用数组作为路径,或使用点分隔的字符串作为路径并检查是否存在和 return 值。
function getValue(object, path) {
return path.split('.').reduce(function (o, k) {
return (o || {})[k];
}, object);
}
var ctrl = { main: { user: { theme: 42 } } };
console.log(getValue(ctrl, "main.user.theme"));
在javascript中我有很多这样的代码。
if (ctrl && ctrl.main && ctrl.main.user) {
SetTheme(ctrl.main.user.theme);
}
太长了。在其他语言中,您可以简单地做到
SetTheme(ctrl?.main?.user?.theme);
在 javascript 中有什么方法可以做到这一点吗?
我试过了,
function safeGet(a,b) { return a ? a[b] : null; }
和
SetTheme(safeGet(safeGet(safeGet(ctrl, 'main'), 'user'), 'theme'));
但这不是很可读。
您可以创建一个通用函数来执行此操作,方法是将表示到您想要的嵌套 属性 的路径的字符串传递给它:
function getValue(object, prop, /*optional*/ valIfUndefined) {
var propsArray = prop.split(".");
while(propsArray.length > 0) {
var currentProp = propsArray.shift();
if (object.hasOwnProperty(currentProp)) {
object = object[currentProp];
} else {
if (valIfUndefined) {
return valIfUndefined;
} else {
return undefined;
}
}
}
return object;
}
然后在任何对象上使用它,例如:
// This will return null if any object in the path doesn't exist
if (getValue(ctrl, 'main.user', null)) {
// do something
}
正确的捷径可能是
if (((ctrl || {}).main || {}).user) { // ...
或者您可以使用数组作为路径,或使用点分隔的字符串作为路径并检查是否存在和 return 值。
function getValue(object, path) {
return path.split('.').reduce(function (o, k) {
return (o || {})[k];
}, object);
}
var ctrl = { main: { user: { theme: 42 } } };
console.log(getValue(ctrl, "main.user.theme"));