使用has()进行Lodash深度对象测试

时间:2015-08-31 13:45:00

标签: lodash

例如,我们有这种数据

08-31 15:18:05.500: E/tinyWRAP(21323): ***ERROR: function: "tsip_header_Date_parse()" 
08-31 15:18:05.500: E/tinyWRAP(21323): file: "src/headers/tsip_header_Date.c" 
08-31 15:18:05.500: E/tinyWRAP(21323): line: "387" 
08-31 15:18:05.500: E/tinyWRAP(21323): MSG: Failed to parse 'Date' header.

我想测试每个信息。对我来说,下面的代码看起来很简单

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

这是很多代码。重构它的最佳方法是什么?

2 个答案:

答案 0 :(得分: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');
}

答案 1 :(得分:0)

您可以使用difference()keys()

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

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