检查嵌套对象是否已声明并具有值而无需这么多条件检查
Check if nested object is declared and has a value without so many conditional checks
我有一个从服务器获取的 JSON 对象。我从中获取值的键看起来像这样:
var myJson = data.body.region.store.customer.name;
我试图在此处获取名称键,但有时 JSON(来自我无法控制的服务)会有一些空字段,例如名称可能未定义,所以该对象实际上看起来像这样:data.body.region.store.customer。有时也可能未定义客户、商店或区域(如果数据不存在,则服务不会 return 值的 null 或空字符串)。
所以如果我需要这个名字,我正在做的是:
if(data.body.region.store.customer.name){
//Do something with the name
}
但是即使 store 没有定义,它也不会获得 name 的值(我希望它是 undefined 因为它不存在)并且程序崩溃。所以我现在正在做的是在使用 AND 操作数获取值之前检查 JSON 的每个部分:
if(data && data.body && data.body.region && data.body.region.store && data.body.region.store.customer && data.body.region.store.customer.name){
//Do something with the name value then
}
这行得通,因为它按顺序检查,所以它首先检查数据是否存在,如果存在则接下来检查 data.body 是否存在,依此类推。每次都要检查很多条件,特别是因为我经常使用该服务来做很多其他事情,他们也需要自己的条件。因此,为了检查名称是否存在,我需要执行 6 个条件,这当然在性能方面(以及整体编码方面)看起来不是很好。我想知道是否有更简单的方法来做到这一点?
您可以尝试关注
function test(obj, prop) {
var parts = prop.split('.');
for(var i = 0, l = parts.length; i < l; i++) {
var part = parts[i];
if(obj !== null && typeof obj === "object" && part in obj) {
obj = obj[part];
}
else {
return false;
}
}
return true;
}
test(myJson, 'data.body.region.store.customer.name');
var myJson = null;
try {
myJson = data.body.region.store.customer.name;
}
catch(err) {
//display error message
}
我有一个从服务器获取的 JSON 对象。我从中获取值的键看起来像这样:
var myJson = data.body.region.store.customer.name;
我试图在此处获取名称键,但有时 JSON(来自我无法控制的服务)会有一些空字段,例如名称可能未定义,所以该对象实际上看起来像这样:data.body.region.store.customer。有时也可能未定义客户、商店或区域(如果数据不存在,则服务不会 return 值的 null 或空字符串)。
所以如果我需要这个名字,我正在做的是:
if(data.body.region.store.customer.name){
//Do something with the name
}
但是即使 store 没有定义,它也不会获得 name 的值(我希望它是 undefined 因为它不存在)并且程序崩溃。所以我现在正在做的是在使用 AND 操作数获取值之前检查 JSON 的每个部分:
if(data && data.body && data.body.region && data.body.region.store && data.body.region.store.customer && data.body.region.store.customer.name){
//Do something with the name value then
}
这行得通,因为它按顺序检查,所以它首先检查数据是否存在,如果存在则接下来检查 data.body 是否存在,依此类推。每次都要检查很多条件,特别是因为我经常使用该服务来做很多其他事情,他们也需要自己的条件。因此,为了检查名称是否存在,我需要执行 6 个条件,这当然在性能方面(以及整体编码方面)看起来不是很好。我想知道是否有更简单的方法来做到这一点?
您可以尝试关注
function test(obj, prop) {
var parts = prop.split('.');
for(var i = 0, l = parts.length; i < l; i++) {
var part = parts[i];
if(obj !== null && typeof obj === "object" && part in obj) {
obj = obj[part];
}
else {
return false;
}
}
return true;
}
test(myJson, 'data.body.region.store.customer.name');
var myJson = null;
try {
myJson = data.body.region.store.customer.name;
}
catch(err) {
//display error message
}