4

在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'));

但这不是很可读。

4

2 回答 2

2

正确的捷径可能是

if (((ctrl || {}).main || {}).user) { // ...

或者您可以使用数组作为路径,或使用点分隔字符串作为路径并检查 aginst 是否存在并返回值。

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"));

于 2016-12-07T16:32:25.027 回答
1

您可以通过将表示所需嵌套属性的路径的字符串传递给它来创建一个通用函数来执行此操作:

  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
}
于 2016-12-07T16:29:45.670 回答