如何检查对象中的 hasOwnProperty 链
How to check chain of hasOwnProperty in objects
我有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');
}
但是这段代码看起来很难看。我们是否有更好的方法来避免 hasownproperty
.
的多个 if 条件和链接
简单:只需检查值是否存在并且具有真值:
if (a.redisData && a.redisData.dbSetting && a.redisData.dbSetting.dbIp) {
// now insert in to database
} else {
alert('DB server Ip missing');
}
这里使用hasOwnProperty
并没有真正的优势。
您可以使用 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');
}
这是库 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
}
如果你真的需要在每个阶段检查 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
可能会满足您的需要。
你可以使用 lodash _.get()
方法来解决这个问题
var ip = _.get(a.redisData, 'dbSetting.dbIp');
if (ip) {
//insert into database
} else {
// not found IP
}
您可以使用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');
}
我有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');
}
但是这段代码看起来很难看。我们是否有更好的方法来避免 hasownproperty
.
简单:只需检查值是否存在并且具有真值:
if (a.redisData && a.redisData.dbSetting && a.redisData.dbSetting.dbIp) {
// now insert in to database
} else {
alert('DB server Ip missing');
}
这里使用hasOwnProperty
并没有真正的优势。
您可以使用 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');
}
这是库 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
}
如果你真的需要在每个阶段检查 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
可能会满足您的需要。
你可以使用 lodash _.get()
方法来解决这个问题
var ip = _.get(a.redisData, 'dbSetting.dbIp');
if (ip) {
//insert into database
} else {
// not found IP
}
您可以使用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');
}