簡體   English   中英

安全訪問嵌套 javascript 對象內的屬性

[英]Safely access a property inside a nested javascript object

對象結構如下。

object = {
  obj1: {
    obj2: {
       name: 'MY name'
    }
  }
}

這種結構是動態的,有時不會有 obj1。

因此,在反應中,您將編寫代碼,例如..

object && obj1 && obj2 && obj2.name

這樣只有當存在對象、obj1 和 obj2 時,才會顯示 obj2.name。

在這種情況下,不會有任何未定義的錯誤,因為在進入函數之前檢查每個對象的存在。

是否有上述代碼的替代方法,以便在所有對象都存在時顯示名稱。 如果沒有,它不應該拋出錯誤。

檢查像

object && object.obj1 && object.obj1.obj2 && object.obj1.obj2.name

 let object = { obj1: { } } if(object && object.obj1 && object.obj1.obj2 && object.obj1.obj2.name) { console.log(object.obj1.obj2.name); } else console.log("no obj2.name and no error"); 

使用hasOwnProperty檢查obj1是否存在

 object = { obj1: { obj2: { name: 'MY name' } } } if(object.hasOwnProperty('obj1')) console.log(object.obj1.obj2.name) else console.log(object.obj2.name) 

嘗試

 object = { obj1: { obj2: { name: 'MY name' } } } var name = (object.hasOwnProperty('obj1')) ? object.obj1.obj2.name : object.obj2.name; console.log(name); 

我建議編寫一個遞歸函數,該函數檢查對象並在找到名稱后遞歸其子對象。 我看到其他人建議捕獲該錯誤-我建議不要針對此類運行時錯誤濫用異常處理。

在讀取嵌套屬性之前,您需要檢查每個屬性:

const name = object && object.obj1 && object.obj1.obj2 && object.obj1.obj2.name;

這很麻煩且冗長,因為您必須一遍又一遍地重復同一件事來訪問深層嵌套的屬性。

我建議使用safeEval函數,該函數通過try / catch來包裝潛在的危險屬性訪問代碼,如果發生錯誤,則返回undefined 這比手動檢查每個屬性要短得多:

const name = safeEval(() => obj.obj1.obj2.name);

這是一個例子:

 const obj = { obj1: { obj2: { name: 'Hello' } } } function safeEval(fn) { try { return fn(); } catch { return undefined; } } const a = obj && obj.obj1 && obj.obj1.obj2 && obj.obj1.obj2.name; const b = safeEval(() => obj.obj1.obj2.name); const c = safeEval(() => obj.obj1.obj2.obj3.obj4.name); console.log(a, b, c); 

暫無
暫無

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

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