2016-10-07 47 views
1

我可以發誓,曾經一次,我遇到了一些代碼,使用一些js庫(也許lodash ??)做一個「深入」檢查是否定義。Javascript「深入」檢查定義

例:

someLib.isDefined(anObject.aNestedObject.anotherNestedObject); 

(如果anotherNestedObject定義將返回true,但將返回false(而不是拋出一個異常)如果anObject或aNestedObject是未定義

難道我完全夢想着,或者是有一些知名的功能,在那裏,這是否

+4

我不認爲這是可能的。表達式'anObject.aNestedObject.anotherNestedObject'在'someLib.isDefined'函數被調用之前被評估,因此在函數有機會做任何事情之前拋出一個異常(如果'anObject'或'aNestedObject'不存在) 。也許如果你將它作爲字符串傳遞:'someLib.isDefined(「anObject.aNestedObject.anotherNestedObject」)' –

+0

只有當該參數是一個字符串 – charlietfl

+0

可以使用'try/catch' – charlietfl

回答

1

Lodash的有():

_.has(object, path) 

例子:

var object = {a: {b: 'test', c: 'test2'}}; 
_.has(object, 'a.b'); 
// => true 
_.has(object, 'a.d'); 
// => false 

Full documentation
Source code for _.has()

+0

抱歉沒有注意到你的意思是檢查存在,編輯。 –

+1

就是這樣 - 我知道我曾經在某個地方見過!謝謝你,先生。 – JMarsch

2

正如我在我的評論,我不認爲這是可能的寫道。
someLib.isDefined函數被調用之前評估表達式anObject.aNestedObject.anotherNestedObject,因此在函數有機會做任何事情之前將引發異常(如果anObject或anNestedObject不存在)。
也許如果你把它作爲一個字符串:someLib.isDefined( 「anObject.aNestedObject.anotherNestedObjec T」)

但是,它很容易檢查,像這樣:

if (anObject && anObject.aNestedObject && anObject.aNestedObject.anotherNestedObject) { 
    ... 
} 

或者只是實現自己的功能,這是很簡單的:

function exists(obj: any, keys: string | string[]) { 
    if (typeof keys === "string") { 
     keys = keys.split("."); 
    } 

    return keys.every(key => { 
     if (!obj) { 
      return false; 
     } 

     obj = obj[key]; 
     return true; 
    }); 
} 

code in playground

1

沒有沒有知名的函數T o這樣做,但你可以這樣安全地檢查它:

if (typeof anObject != "undefined" 
&& typeof anObject.aNestedObject != "undefined" 
&& typeof anObject.aNestedObject.anotherNestedObject != "undefined") { 
    console.log("defined"); 
}else{ 
    console.log("undefined"); 
}