我一直在尋找一個代碼庫,不幸看到了很多類似的代碼:安全的方法來檢查可讀的深層物體?
if (module && module.foo && module.foo.bar && module.foo.bar.baz)
我開始使用Google,看看是否有一個lib或東西,使這個容忍的;沒有找到,但我仍然確定某處存在)。我寫這個很快,但有點討厭它,因爲傳入根對象和一個字符串來分割'。'是很醜的;希望有更好的東西:
<!DOCTYPE html>
<html>
<head>
<title>safe tests</title>
<script type="text/javascript">
function assert(condition, desc) {
var d = document, li = d.createElement("li");
li.className = condition ? "pass" : "fail";
li.appendChild(d.createTextNode(desc));
d.getElementById('results').appendChild(li);
}
</script>
<style type="text/css">
#results li.pass { color: green; }
#results li.fail{ color: red; }
</style>
</head>
<body>
<ul id="results"></ul>
<script type="text/javascript">
function safe(root, s) {
var split = s.split('.'), checked = root;
for (var i = 0, len = split.length; i < len; i++) {
if (checked[split[i]]) {
checked = checked[split[i]];
continue;
} else {
return false;
}
}
return true;
}
var foo = {
bar: {
baz: {
qux: 'yippie!'
}
}
}
assert(safe(foo, 'bar'), "finds first sub object");
assert(safe(foo, 'bar.baz'), "finds first and then second sub object");
assert(safe(foo, 'bar.baz.qux'), "finds first, second, third, sub object");
assert(!safe(foo, 'bar.baz.qux.NOT'), "rejects if not defined (end)");
assert(!safe(foo, 'NOPE.baz.qux.NOT'), "rejects if not defined (front)");
assert(!safe(foo, 'bar.NO.baz'), "rejects if not defined (middle)");
</script>
</body>
</html>
任何建議或庫已經處理這是精益?
從我所看到的,你的摘要可能失敗,並: 變種富= { 條:{ 巴茲:{ qux:假 }} } 除此之外,它似乎做的工作。 @Slukehart的解決方案看起來不錯。 – eburgos 2013-03-14 01:02:00
@eburgos如果包含false,那麼這是最後一個prop的好點; qux:錯誤...這很容易修復;但我的問題是一般的醜陋,我必須自己做(而不是使用現有的解決方案)。看起來這是一個應該解決的常見問題。 – Rob 2013-03-14 01:15:04