如果链中存在所有对象,则获取值,否则获得后备值

时间:2014-07-02 13:23:05

标签: javascript

感觉有点愚蠢的问... 我想得到这样的东西:

var value = $scope.settings.paper.font.color || 0;

问题是某些中间对象可能不存在。

如果所有“对象链”都存在,是否存在获得的最终方法,如果不存在则获得一些回退?

例如,如果所有对象都存在,我们可以返回颜色的值,但是如果只存在$ scope.settings,并且没有 paper 对象它,我会得到一个错误,而不是0。

3 个答案:

答案 0 :(得分:2)

首先:它没有内置功能。

最短的通用解决方案

只需将其打包成try - catch

即可
try {
   // handles defaultVal if d is undefined
   yourVar = typeof a.b.c.d === 'undefined' ? defaultVal:a.b.c.d;
} catch (e) {
   // handles defaultVal if a,b or c are undefined
   yourVar = defaultVal;
}

替代解决方案

您可以使用以下函数安全地遍历对象(gv - for getValue):

var gv = function(scope, chainStr, defaultValue) {
    var chain = chainStr.split('.');
    for (var i = 0; i < chain.length; i++) {
        var newScope = scope[chain[i]];
        if (typeof newScope !== 'undefined') {
            scope = newScope;
        } else {
            return defaultValue;
        }
    };
    return newScope;
};

像这样:

var a = {b:{c:{d:3}}};

console.log(gv(window, 'a.b.c.d', -1));
// 3
console.log(gv(window, 'a.b.c.e', -1));
// -1 
console.log(gv(a, 'b.c.d', -1));
// 3
console.log(gv(a, 'b.c.e', -1));
// -1

答案 1 :(得分:1)

当然,只需检查$ scope和命名空间中每个属性的存在:

var value = (typeof $scope != 'undefined' && $scope.settings && $scope.settings.paper && $scope.settings.paper.font && $scope.settings.paper.font.color) || 0;

括号中语句的最后一部分将返回.font

的值

示例:http://jsfiddle.net/silkster/gM8uh/

答案 2 :(得分:0)

您还可以使用$parse服务中的内置版本:

var value = $parse('settings.paper.font.color || 0')($scope);

它将在幕后进行所有必要的检查。

演示:http://plnkr.co/edit/1GLb5PEvxMzPMYc5ZxZn?p=preview