Javascript Steam API,不同的json格式

Javascript Steam API,不同的json格式,javascript,node.js,steam-web-api,discord.js,Javascript,Node.js,Steam Web Api,Discord.js,最近我在我的discord机器人中集成了CSGO统计数据,但今天我看到,对于几乎每个玩家,API都会发送不同的json数据 这里有两个例子: 我的问题是如何正确地请求数据,这样一场胜利才是真正的胜利,而不是杀戮 .addField('**Wins:*',`${object.playerstats.stats[5].value}',true) .addField(“**播放时间:*”,“${object.playerstats.stats[2].value}+'minutes',true)

最近我在我的discord机器人中集成了CSGO统计数据,但今天我看到,对于几乎每个玩家,API都会发送不同的json数据

这里有两个例子:

我的问题是如何正确地请求数据,这样一场胜利才是真正的胜利,而不是杀戮

.addField('**Wins:*',`${object.playerstats.stats[5].value}',true)
.addField(“**播放时间:*”,“${object.playerstats.stats[2].value}+'minutes',true)
.addField('**Kills:*',`${object.playerstats.stats[0].value}',true)
.addField('**deathers:*',`${object.playerstats.stats[1].value}',true)
.addField(“**:*”,“${object.playerstats.stats[3].value}”,true)
.addField(“**挣到的钱:*”,“${object.playerstats.stats[7].value}”,true)
.addField(“**Knife kills:*”,“${object.playerstats.stats[9].value}”,true)
.addField('**Headshot kills:*','${object.playerstats.stats[24].value}',true)
.addField(“**支配:*”,“${object.playerstats.stats[39].value}”,true)

.addField('**Rounds:*','${object.playerstats.stats[44].value}',true)
与其尝试引用数组索引,为什么不将API响应转换为更易于解析的格式

// do this once...
let playerStats = {};
object.playerstats.stats.forEach(s => playerStats[s.name] = s.value);

// ...then you can use the playerStats variable however you need:
.addField('**Kills:**', `${playerStats.total_kills}`, true)
.addField('**Wins:**', `${playerStats.total_wins}`, true)

统计项的
name
属性似乎是唯一的,可以找到。您可以使用按名称查找正确的统计数据

const stats = object.playerstats.stats
const totalKills = stats.find(s => s.name === 'total_kills').value
const totalDeaths = stats.find(s => s.name === 'total_deaths').value
更进一步,您可以使用为数组中的每个项生成一个对象,该对象的键为
name
,值为
value
。这样,您可以像访问对象一样访问它

const stats = object.playerstats.stats
const statsObj = stats.reduce((c, e) => (c[e.name] = e.value, c), {})

const totalKills = statsObj.total_kills
const totalDeaths = statsObj.total_deaths

stats数组只是没有排序。可以使用.find()从统计数据中获取正确的条目

比如说

const totalWins = object.playerstats.stats.find(stat => {
    return stat.name === 'total_wins';
});
.addField('**Wins:**', `${totalWins.value}`, true)

你用错误的方法解决这个问题

JSON不是一种有序的格式。这意味着无法保证每次JSON数据都会以相同的顺序返回。这不是API的默认设置

有一种方法仍然可以使用您的方法:按名称对“stats”数组进行排序。但这是一个长期的操作,不是一个好主意

实现这一点的方法是按名称进行查找。 例如,如果要查找wins,请执行以下操作:

object.playerstats.stats.find(elem => elem.name === 'total_wins').value;
find函数执行查找并返回与谓词匹配的第一个元素(elem.name==='total_wins')。如果元素与谓词不匹配,它将返回null(因此在这里要小心)

您可以执行一个为您返回值的函数:

findValue(statsArray, name) {
    const entry = statsArray.find(elem => elem.name === name);
    return entry ? entry.value : '?';
}
然后您的代码将如下所示:

 ...
 .addField('**Wins:**', findValue(object.playerstats.stats, 'total_wins'), true)
 ...

这里最主要的一点是:永远不要假设JSON中的字段每次都返回相同的值。始终使用查找,而不是索引(除非它已排序)。

请告诉我:D.reduce方法非常好,比实际的查找更好,因为您只需循环stats数组一次,而不是多次循环。reduce()与.find()相比更可取,但您可能希望调整.find()回调以进行相等比较(
s.name==='total_kills'
),以便.find()正常工作。