2017-09-16 53 views
0

我做我的javascript代码下面的JavaScript数组元素错误,同时访问inspite有检查

if(
    typeof player['stats'] != undefined && 
    typeof player['stats']['guild'] != undefined && 
    typeof player['stats']['guild']['master'] != undefined && 
    typeof player['stats']['guild']['master']['since'] != undefined 
) 

但是我得到错误:

Cannot read property 'since' of null

我一直坚持这样的而。任何JavaScript大师能帮助我吗?

+1

删除'typeof's和'= undefined'部分! –

+0

使用'lodash#get'来简化这种怪异的构造。 – alexmac

+0

@ibrahimmahrir没有帮助:(更新:没有看到你的编辑,让我再试一次 –

回答

1

的typeof返回字符串,所以比较反对“未定义”

if(
    typeof player['stats'] != "undefined" && 
    typeof player['stats']['guild'] != "undefined" && 
    typeof player['stats']['guild']['master'] != "undefined" && 
    player['stats']['guild']['master'] != null && 
    typeof player['stats']['guild']['master']['since'] != "undefined" 
) 
+2

这仍然不能解决问题,因为'player ['stats'] ['guild'] ['master']''null'not'undefined'(从错误中推导出来).. –

+0

这样做没有工作... –

+0

@ibrahimmahrir是错过了,它将需要比较为null,代码更正,感谢您指向 – Dij

1

只是检查值是否truthy:

if(
    player['stats'] && 
    player['stats']['guild'] && 
    player['stats']['guild']['master'] && 
    player['stats']['guild']['master']['since'] != undefined // only check the last one as it is probably not an object but another value such as 0 (depending on what your data looks like, if you have it as an object then just remove the != undefined check) 
) 
+1

如果玩家['stats'] ['guild'] ['master '] ['since']'具有_falsy_值(false,0,“”)? – alexmac

+0

@alexmac它主要是一个他将在'if'主体中使用的对象。但我已经添加了一个支票以防万一。 –

0

你可以写你传递对象一个相当简单的对象getter函数然后用点分隔键找到这样的值:

function getObj(obj, key) { 
    return key.split(".").reduce((acc, cur) => { 
    if (acc !== undefined) { 
     return acc[cur]; 
    } 
    return acc; 
    }, obj); 
} 

然后,您可以抓住t他看重你想看看它是否未定义或不:

const player = { 
    stats: { 
    guild: { 
     master: { 
     since: '2004' 
     } 
    } 
    } 
}; 

const since = getObj(player, 'stats.guild.master.since'); 
if (since) { 
    // do some code 
} 

这是你可以在任何物体上使用一个方便实用的功能,让您的if语句更漂亮。

+0

我认为这将工作,只有当你删除'!== undefined'并将其添加到if语句中'if(since!== undefined)'因为在他的情况下master是'null' – Slai

+0

已更新所以它优雅地处理null和未定义:https://jsfiddle.net/vhnoqo8u/ – jas7457

0

您也可以避免临时变量的多次查找:

player = { stats: { guild: { master: null } } } 
 

 
if ((temp = player.stats) && 
 
    (temp = temp.guild) && 
 
    (temp = temp.master) && 
 
    (temp = temp.since) !== undefined)   
 
    console.log(true , temp) 
 
else 
 
    console.log(false, temp) 
 

 

 
player.stats.guild.master = { since: 'today' } 
 

 
if ((temp = player.stats) && 
 
    (temp = temp.guild) && 
 
    (temp = temp.master) && 
 
    (temp = temp.since) !== undefined)   
 
    console.log(true , temp) 
 
else 
 
    console.log(false, temp)