簡體   English   中英

如何檢查object中的object是否存在

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM