[英]How to check if object within object exists
似乎以下用於檢查 object 成員是否存在的技術會產生錯誤,因為在檢查之前尚未聲明“bar”父 object,這意味着我必須在檢查之前聲明它或使用兩個“typeof”表達式,其中任何一個都是多余的代碼:
var foo = {},
newVal = (typeof foo.bar.myVal !== 'undefined' ? foo.bar.myVal : null );
Error: foo.bar is undefined
那么,如何檢查未聲明的 object 中的成員是否存在而不產生錯誤?
我喜歡 javascript,但有時......
只需使用以下代碼即可完成:
var newVal = (foo && foo.bar && typeof foo.bar.myVal !== 'undefined') ? foo.bar.myVal : foo.bar.myVal
一個屬性是 null 或未定義,它將被評估為 false,因此上述代碼將只處理第一個“false”語句。
var newVal = ('foo' in window && // could be typeof foo !== 'undefined' if you want all scopes
'bar' in foo &&
'myVal' in foo.bar) ? foo.bar.myVal : null;
公平地說,javascript 讀起來幾乎像自然語言。
最簡單的測試是:
if (foo && foo.bar) {
// play with foo.bar.myVal ...
}
正如Matthew Abbott在他的回復中給出的那樣,如果您對子屬性進行了大量深入研究,其中整個 object 或沿鏈的某個位置可以是 null,您可以編寫一個方法供以后使用。 下面是我使用lodash的實現。
checkGraph(obj, graphPath) {
if (obj) {
let root = obj;
_.each(graphPath.split('.'), part => {
if (root[part]) {
root = root[part];
} else {
return false; // bad property
}
});
return true;
}
return false; // bad object
}
您可以像這樣調用該方法:
if (this.checkGraph(object, 'property.subproperty') {
// do thing
}
你可以把它包裝成一個方法:
function checkGraph(obj, graphPath)
{
var parts = graphPath.split(".");
var root = obj;
for (var i = 0; i < parts.length; i++)
{
var part = parts[i];
if (root[part] && root.hasOwnProperty(part))
root = root[part];
else
return false;
}
return true;
}
您可以將其稱為:
var foo = {},
newVal = checkGraph(foo, "bar.myVal") ? foo.bar.myVal : null;
還有另一種方法是使用像Babel這樣的JS 轉譯器:
if (foo?.bar) {
// play with foo.bar.myVal ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.