2017-08-17 27 views
-1

剛剛從Python世界中的nodejs開始。對象迭代看起來不像Python中那麼直觀。我有一個複雜的字典對象,我與它有兩個方面的挑戰:對象迭代和拋出nodejs中的異常

  1. 我想拋出一個異常,並在處理任何一點保釋,如果我沒有找到所需要的密鑰(而不是讓對的NodeJS添加'未定義')。有沒有辦法做到這一點,沒有一堆ifs。例如

    path = dict.url.path //if url or path are not present, throw exception 
    //more nested dict/array looping 
    
  2. 乾淨的嵌套循環的最佳方式是什麼?我有一堆數組作爲字典鍵的值,並且循環變得很深。 e.g

    dict['values'].forEach(value => { 
        value['items'].forEach(item => { 
        ... 
        }); 
    }); 
    
+0

這應該是更好地分裂成兩個獨立的問題。 –

回答

0

1.

path = dict && dict.url && dict.url.path 

它被稱爲一個 '後衛' 運算符。(AKA '和' 操作符)如果它們中的一個是falsy值。路徑也將是falsy值,如undefined或null

  1. 您可以像這樣使用它。您可以通過一些技巧縮短代碼長度,但會損害可讀性。

如果你擔心縮進去太深,記住上面

value => { 
    value['items'].forEach(item => { 
    ... 
    }); 
} 

是一個功能,你可以把它的變量。

編輯:如果你想拋出問題一號

try { 
    path = dict.url.path; 
    if (!path) { 
    throw new Error('no path'); 
    } 
    // some other codes 
} catch (err) { 
    console.error('dict or url is undefined!', err); 
} 
+0

第一個問題是關於相反的「我希望拋出異常**並保釋,如果在處理中的任何一點我沒有找到所需的密鑰」 –

+0

@YuryTarabanko謝謝我更新了我的答案 – ZeroCho

+0

沒問題。但是我不明白如果'dict.url'沒有'path'w/o ifs,你的代碼會拋出什麼。 –

0

個例外,你的問題的第一部分。只要您使用節點V8 +,你可以使用Proxy來完成這個

const strictAccess = obj => new Proxy(obj, { 
 
    get(target, property) { 
 
    if (!Reflect.has(target, property)) { 
 
     throw new Error(`Object doesn't have property ${property}.`) 
 
    } 
 
    const value = Reflect.get(target, property) 
 

 
    return typeof value === 'object' ? strictAccess(value) : value 
 
    } 
 
}) 
 

 
const dict = strictAccess({ 
 
    url: { 
 
    path: 'path value' 
 
    } 
 
}) 
 

 
try { 
 
    dict.missingProperty 
 
} catch (e) { 
 
    console.log(e.message) 
 
} 
 

 
try { 
 
    dict.url.missingProperty 
 
} catch (e) { 
 
    console.log(e.message) 
 
} 
 

 
console.log(dict.url.path)