簡體   English   中英

是否有解析JavaScript對象的本機方法?

[英]Is there a native way to parse a JavaScript object?

假設我想訪問abcd ,我不確定bc存在。 '天真'檢查將是:

if (a.b && a.b.c && a.b.c.d == 5) doSomething(a.b.c.d);

我考慮過這個並編寫了這個改進這個的函數:

Object.prototype.parse = function (keys, def) {
  return keys.split('.').reduce(function (prev, curr) {
    if (prev) {
      return prev[curr];
    }
  }, this) || def;

};

你會像這樣使用它:

var a = {
  b: {
    c: {
      d: 5
    }
  }
};

console.log(a.parse('b.c.d', 3)); // If b, c or d are undefined return 3

但我想知道我是否缺少一種更好的本地方式來實現這一目標,而不必將此功能添加到項目中。

謝謝!

也許不是你所要求的,但可能與你所能得到的“原生”接近(你提供的一個稍微更緊湊的split / reduce代碼片段):

var a = {b:{c:{d:5}}};
("b.c.d").split(".").reduce(function(p,c){return p && p[c];},a); //5
("b.c.e").split(".").reduce(function(p,c){return p && p[c];},a); //undefined

如果你希望找到一個像"abcd"這樣的字符串的解決方案,那么你需要使用eval (不是重新編排)或者a對象需要是全局的(也不推薦)或者對象需要是屬性另一個很難弄巧成拙的對象。

我想我有另一個解決這個問題的辦法,我試圖在幾分鍾內完成這個。 如果您正在處理窗口范圍,則可以使用我的函數來查看對象是否存在或返回默認值。

function parseObj(obj){
    try{
        return eval(obj);
    }catch(e){
        return null;
    }
}

用法

alert(parseObj("a.b.c.d"));

我不知道這是不是你要找的,但我相信它會給你另一個想法。 干得好。

唯一的本機方式是eval ,但我不推薦它,因為可以用來執行任意代碼。 這可能沒問題,但如果你的“abcd”樣式字符串來自不受信任的用戶則不行。 我堅持你的手工解決方案或使用dotty

var a = {
  b: {
    c: {
      d: 5
    }
  }
};
console.log(eval("a.b.c.d"));

當未定義b或c時,eval()將拋出與本機等效項相同的錯誤,因此您需要使用try {} catch {}塊進行換行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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