2015-08-31 79 views
0

例如,我們有這樣的數據Lodash深對象測試有()

user = { 
    name : 'Scott', 
    info : { 
     age : 25, 
     addr1 : 'A', 
     addr2 : 'B', 
     zipCode : 60000 
    } 
} 

我想測試每個信息。對我來說,下面的代碼看起來很基本

if (_.has(usr, 'info.age') && _.has(usr, 'info.addr1') && _.has(usr, 'info.addr2') && _.has(usr, 'info.zipCode')) { 
    // do your stuff since all criteria were met 
} 

這是很多的代碼。什麼是重構它的最好方法?

+0

你可以創建函數並將所有對象參數作爲數組輸入。像_.hasArray(object,arrayOfDotMappedProperties) –

+0

Tho lodash已經支持這個功能:_.has(object,['a','b','c']); –

+0

@LauriOrgla我試了一下,但是當我添加第二個屬性後,我得到了一個錯誤。 – devwannabe

回答

1

通過_.every()創建要檢查的道具列表,並運行它們:

var props = ['age', 'addr1', 'addr2', 'zipCode']; 

if(typeof user === "object" && _.every(props, function(prop) { return _.has(user.info, prop); })) { 
    console.log('whatever you want to do'); 
} 

如果您需要在對象,檢查更多的子道具,你可以做這樣的:

user = { 
    name : 'Scott', 
    moreInfo: { // another sub section of props 
     gender: 'm' 
    }, 
    info : { 
     age : 25, 
     addr1 : 'A', 
     addr2 : 'B', 
     zipCode : 60000 
    } 
} 

var props = ['info.age', 'info.addr1', 'info.addr2', 'info.zipCode', 'moreInfo.gender']; 

if(_.every(props, function(prop) { return _.has(user, prop); })) { 
    console.log('whatever you want to do'); 
} 
+0

如果用戶爲空,則這將拋出,OP原來的代碼不會。 – mik01aj

+0

謝謝@ m01 - 編輯。 –

0

你可以使用difference()keys()此:

var props = [ 'age', 'addr1', 'addr2', 'zipCode' ]; 

if (!_.difference(props, _.keys(user.info)).length) { 
    // Has required properties... 
}