如何默认为javascript中不存在的json值的值?
My node.js应用程序使用来自API的大量json值。例如:如何默认为javascript中不存在的json值的值?,javascript,node.js,Javascript,Node.js,My node.js应用程序使用来自API的大量json值。例如: stats.player.rank stats.player.game.coins 我想知道的是,在调用不存在的json路径时,如何将默认值设置为0?如果我做var coins=player.game.coins+player.game2.coins
stats.player.rank
stats.player.game.coins
我想知道的是,在调用不存在的json路径时,如何将默认值设置为0?如果我做
var coins=player.game.coins+player.game2.coins如果玩家在game2中没有硬币,我会得到TypeError:无法读取未定义的属性'coins',因为API中没有对象。您可以使用逻辑运算符&&
和|
来完成此操作
var coins = player.game.coins +
((player.game2 && player.game2.coins) || 0);
如果player
可能未定义,则在检查game2
之前,您需要检查以确保存在。所以应该是((player&&player.game2&&player.game2.coins)| | 0)
一旦你意识到代码是如何计算的,它就有意义了&&
是AND操作,因此它从左到右检查每个值是否存在player
存在,并且player.game2
存在,并且player.game2.coins
存在,因此停止比较并使用值。如果其中任何一个失败,它将跳出括号并执行OR,OR返回默认值0
。有多种方法可以实现这一点。可以使用try/catch块尝试设置值、if/else语句或三元运算符
使用默认值尝试/捕获
var coins = 0
try {
coins = player.game2.coins
} catch(e) {
// Error because player or game2 doesn't exist / is null
}
var coins = 0
if (player && player.game2 && player.game2.coins) {
coins = player.game2.coins
}
带有默认值的if语句
var coins = 0
try {
coins = player.game2.coins
} catch(e) {
// Error because player or game2 doesn't exist / is null
}
var coins = 0
if (player && player.game2 && player.game2.coins) {
coins = player.game2.coins
}
三元
var coins = (player && player.game2 && player.game2.coins) ? player.game2.coins : 0
如果需要,您可以使用类型检查(即确认player.game2是一个对象,typeof player.game2==='object'
),但如果它总是为null或对象,则可能会有过大的杀伤力。可以使用ternany运算符来实现这一点
//var coins=player.game.coins+player.game2.coins
//由于您通常将json映射到特定类型的对象,因此我们将创建一个用于测试的对象
变量播放器={
游戏:{
硬币:10
}
};
控制台日志(播放器);
控制台.log(玩家.游戏.硬币);
//我们使用三元运算符来实现测试并设置默认值
var coins=player.game.coins+(player.game2?player.game2.coins:0)
console.log(硬币);
我的建议是更改api并返回玩家的游戏列表。
通过这种方式,您可以使用reduce获取玩家的所有硬币,这是一种更好的结构化数据
{
player:
{
games:
[
{
coins: 3
},
{
coins: 5
}
]
}
}
var totalCoins = player.games.reduce(function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue;
}, 0);
这里的问题是,它在进入OR语句之前抛出TypeError。只有当游戏对象未定义,而不仅仅是coins属性未定义时,才会抛出错误。顺便说一句,更改脚本也是为了完成这种情况