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