2015-08-31 3 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 (объект, ['a', 'b', 'c']); –

+0

@LauriOrgla Я пробовал, но я получаю false, когда добавляю второе свойство. – 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... 
} 
Смежные вопросы