私はコードベースを見ていましたが、残念ながら次のようなコードがたくさんありました。
if (module && module.foo && module.foo.bar && module.foo.bar.baz)
これを許容できるようにする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>
これをすでに処理している無駄のない提案やライブラリはありますか?