如何默认为javascript中不存在的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

My node.js应用程序使用来自API的大量json值。例如:

stats.player.rank
stats.player.game.coins

我想知道的是,在调用不存在的json路径时,如何将默认值设置为0?如果我做
var coins=player.game.coins+player.game2.coins您可以使用逻辑运算符
&&
|
来完成此操作

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属性未定义时,才会抛出错误。顺便说一句,更改脚本也是为了完成这种情况