如何检查对象中的hasOwnProperty链

时间:2018-08-14 12:16:48

标签: javascript angularjs node.js hasownproperty

我有这样的json

.to_json

因此,当所有密钥中的所有数据都存在时,我必须将该数据推送到数据库中 为此,我必须验证像这样的数据

var a = {
    "name": "test1",
    "redisData": {
        "redisIp": "127.0.0.1",
        "dbSetting": {
            "dbIp": "127.0.0.1",
            "dbUserName": "root",
            "dbUserPassword": "root",
        },
        "otherData":{
            "email":"a@gmail.com"
        }
    }
}

但是这段代码很难看。我们是否有更好的方法来避免if (a.hasOwnProperty("redisData")) { if (a.redisData.hasOwnProperty("dbSetting")) { if (a.redisData.dbSetting.hasOwnProperty("dbIp")) { if (a.redisData.dbSetting.dbIp) { // now insert in to database } else { alert('DB server Ip missing'); } } else { alert('DB server Ip missing'); } } else { alert('DB server Ip missing'); } } else { alert('DB server Ip missing'); } 的多次if条件和链接。

6 个答案:

答案 0 :(得分:2)

简单:只需检查值是否存在并具有真实值:

if (a.redisData && a.redisData.dbSetting && a.redisData.dbSetting.dbIp) {
    // now insert in to database
} else {
    alert('DB server Ip missing');
}

在此处使用hasOwnProperty并没有真正的优势。

答案 1 :(得分:2)

您可以使用try catch子句,例如:

try {
   if (a.redisData.dbSetting.dbIp) {
     // now insert in to database
   } else {
       alert('DB server Ip missing');
   }
} catch(e) {
   alert('DB server Ip missing');
}

答案 2 :(得分:1)

这是ramda.js库中的简单函数,可帮助您以安全的方式获取任何嵌套属性:

function path(paths, obj) {
    var val = obj;
    var idx = 0;
    while (idx < paths.length) {
      if (val == null) {
        return;
      }
      val = val[paths[idx]];
      idx += 1;
    }
    return val;
};

const dbIp = path(["redisData","dbSetting","dbIp"], a)
if(dbIp) {
    // now insert in to database
}

答案 3 :(得分:1)

如果您确实需要在每个阶段检查hasOwnProperty并且想知道在哪个阶段都找不到密钥,则可以编写这样的函数。

function hasNestedProperty(obj, keys) {
    for(let key of keys) {
        if (obj.hasOwnProperty(key)) {
            obj = obj[key];
        }
        else {
            return {result: null, found: false, lastKey: key}
        }
    }
    return {result: obj, found: true}
}
...
var r = hasNestedProperty(a, ["redisData", "dbSetting", "dbIp"]);
if (r.found) {
    // insert into DB using r.result
}

但是在大​​多数情况下,try...catch或带有if的{​​{1}}可能会满足您的需求。

答案 4 :(得分:1)

您可以使用https://lodash.com/docs/4.17.10#has

    var databaseIP = _.has(a, 'redisData.dbSetting.dbIp');

    if (databaseIP) {
       // now insert in to database
    }
    else {
     alert('DB server Ip missing');
    }

答案 5 :(得分:0)

您可以使用lodash _.get()方法解决该问题

var ip = _.get(a.redisData, 'dbSetting.dbIp');

if (ip) {
   //insert into database
} else {
   // not found IP
}