2012-07-27 49 views
3

我想檢查複雜對象鏈中是否有任何對象丟失。 我已經想出了以下解決方案,有沒有更好的方式來完成相同的?如何檢查對象鏈中任何位置的「未定義」?

var lg = console.log; 
var t = { a:{a1: 33, a12:{ aa1d: 444, cc:3 } }, b:00}; 
var isDefined = function(topObj, propertyPath) { 
    if (typeof topObj !== 'object') { 
     throw new Error('First argument must be of type \'object\'!'); 
    } 
    if (typeof propertyPath === 'string') { 
     throw new Error('Second argument must be of type \'string\'!'); 
    } 
    var props = propertyPath.split('.'); 
    for(var i=0; i< props.length; i++) { 
     var prp = props[i]; 
     lg('checking property: ' + prp); 
     if (typeof topObj[prp] === 'undefined') { 
      lg(prp + ' undefined!'); 
      return false; 
     } else { 
      topObj = topObj[prp]; 
     }   
    } 
    return true; 
} 
isDefined(t, 'a.a12.cc'); 
+1

[javascript測試存在嵌套的對象鍵]的可能的重複(http://stackoverflow.com/questions/2631001/javascript-test-for-existence-of-nested-object-key) – 2012-07-27 14:32:08

+0

@Felix問題不是重複的。重複項不考慮來自原型鏈的繼承屬性。 – 2012-07-27 14:51:34

+0

@RobW:這是沒有要求,很容易改變。整體方法不會改變。 – 2012-07-27 15:14:58

回答

3

您的概念是確定的,但代碼必須更改。當屬性值爲null時,它不能具有任何屬性。嘗試訪問null上的屬性會導致錯誤。爲了解決這個問題,使用方法:

for (var i=0; i<props.length; i++) { 
    var prp = props[i], 
     val = topObj[prp]; 
    lg('checking property: ' + prp); 
    if (typeof val === 'undefined') { 
     lg(prp + ' undefined!'); 
     return false; 
    } else if (val === null) { 
     return i === props.length-1; // True if last, false otherwise 
    } else { 
     topObj = val; 
    } 
} 
+0

很好的結果,謝謝 – krul 2012-07-27 14:39:36

+1

@krul另一個問題:不要使用'var lg = console.log;'這會在Chrome中破解。使用'var lg = console.log.bind(console);'來代替'console.log'的上下文。 – 2012-07-27 14:59:19

+0

羅布W,謝謝,我知道,但沒有注意,無論如何。 – krul 2012-07-27 15:38:43

7

你可以更簡單地定義你的函數是這樣的:

var isDefined = function(value, path) { 
    path.split('.').forEach(function(key) { value = value && value[key]; }); 
    return (typeof value != 'undefined' && value !== null); 
}; 

工作例如在jsfiddle