在CoffeeScript中,如何基于与变量匹配的另一个值从对象中获取值?
我正在为我的团队开发一个机器人,到目前为止,我的搜索结果都是空的。我正在从一个API检索一个JSON对象,它返回的很好。我试图做的是根据另一个属性是否与传递给函数的变量匹配来获取对象元素的属性值。更详细地说,我试图基于在CoffeeScript中,如何基于与变量匹配的另一个值从对象中获取值?,coffeescript,slack,hubot,Coffeescript,Slack,Hubot,我正在为我的团队开发一个机器人,到目前为止,我的搜索结果都是空的。我正在从一个API检索一个JSON对象,它返回的很好。我试图做的是根据另一个属性是否与传递给函数的变量匹配来获取对象元素的属性值。更详细地说,我试图基于类哈希检索字符。我试过了,但没用。它会导致字符未定义 if data.characters[0].characterBase.classHash is classHash characterId = data.characters[0].characterBase.charac
类哈希
检索字符。我试过了,但没用。它会导致字符未定义
if data.characters[0].characterBase.classHash is classHash
characterId = data.characters[0].characterBase.characterId
else if data.characters[1].characterBase.classHash is classHash
characterId = data.characters[1].characterBase.characterId
else if data.characters[2].characterBase.classHash is classHash
characterId = data.characters[2].characterBase.characterId
JSON对象如下所示:
"characters": [
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009322984539",
"dateLastPlayed": "2016-07-31T02:53:56Z",
"minutesPlayedThisSession": "130",
"minutesPlayedTotal": "40010",
"powerLevel": 335,
"raceHash": 3887404748,
"genderHash": 3111576190,
"classHash": 2271682572}
},
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009340115467",
"dateLastPlayed": "2016-06-22T00:28:46Z",
"minutesPlayedThisSession": "108",
"minutesPlayedTotal": "11113",
"powerLevel": 333,
"raceHash": 2803282938,
"genderHash": 2204441813,
"classHash": 671679327}
},
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009327058547",
"dateLastPlayed": "2016-06-12T23:30:01Z",
"minutesPlayedThisSession": "62",
"minutesPlayedTotal": "9831",
"powerLevel": 334,
"raceHash": 898834093,
"genderHash": 3111576190,
"classHash": 3655393761}
}
我正在尝试获取characters[].characterBase
的characterId
,其中characters[].characterBase.classHash
等于传入的字符。假设我传入2271682572
作为classHash
,我想返回与classHash
匹配的字符,在本例中为2305843009322984539
有人能帮我或给我指出正确的方向吗?假设字符是唯一的:
getCharIdByClassHash = (characters, classHash) ->
characters.reduce(((result, char) ->
result or # if we've already found the result, pass it thru
(if char.characterBase.classHash is classHash
char.characterBase.characterId
else
null)
), null)
您将返回characterId,如果找不到匹配项,则返回null
例子:
编辑
这假设您的“json”不是
"characters": [
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009322984539",
"dateLastPlayed": "2016-07-31T02:53:56Z",
"minutesPlayedThisSession": "130",
"minutesPlayedTotal": "40010",
"powerLevel": 335,
"raceHash": 3887404748,
"genderHash": 3111576190,
"classHash": 2271682572,
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009340115467",
"dateLastPlayed": "2016-06-22T00:28:46Z",
"minutesPlayedThisSession": "108",
"minutesPlayedTotal": "11113",
"powerLevel": 333,
"raceHash": 2803282938,
"genderHash": 2204441813,
"classHash": 671679327,
{
"characterBase": {
就像你写的,但它是
"characters": [
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009322984539",
"dateLastPlayed": "2016-07-31T02:53:56Z",
"minutesPlayedThisSession": "130",
"minutesPlayedTotal": "40010",
"powerLevel": 335,
"raceHash": 3887404748,
"genderHash": 3111576190,
"classHash": 2271682572
}
}, {
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009340115467",
"dateLastPlayed": "2016-06-22T00:28:46Z",
"minutesPlayedThisSession": "108",
"minutesPlayedTotal": "11113",
"powerLevel": 333,
"raceHash": 2803282938,
"genderHash": 2204441813,
"classHash": 671679327
}
}, {
"characterBase": {
这就是我认为你的意思 假设characterID
s是唯一的:
getCharIdByClassHash = (characters, classHash) ->
characters.reduce(((result, char) ->
result or # if we've already found the result, pass it thru
(if char.characterBase.classHash is classHash
char.characterBase.characterId
else
null)
), null)
您将返回characterId,如果找不到匹配项,则返回null
例子:
编辑
这假设您的“json”不是
"characters": [
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009322984539",
"dateLastPlayed": "2016-07-31T02:53:56Z",
"minutesPlayedThisSession": "130",
"minutesPlayedTotal": "40010",
"powerLevel": 335,
"raceHash": 3887404748,
"genderHash": 3111576190,
"classHash": 2271682572,
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009340115467",
"dateLastPlayed": "2016-06-22T00:28:46Z",
"minutesPlayedThisSession": "108",
"minutesPlayedTotal": "11113",
"powerLevel": 333,
"raceHash": 2803282938,
"genderHash": 2204441813,
"classHash": 671679327,
{
"characterBase": {
就像你写的,但它是
"characters": [
{
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009322984539",
"dateLastPlayed": "2016-07-31T02:53:56Z",
"minutesPlayedThisSession": "130",
"minutesPlayedTotal": "40010",
"powerLevel": 335,
"raceHash": 3887404748,
"genderHash": 3111576190,
"classHash": 2271682572
}
}, {
"characterBase": {
"membershipId": "4611686018451933949",
"membershipType": 2,
"characterId": "2305843009340115467",
"dateLastPlayed": "2016-06-22T00:28:46Z",
"minutesPlayedThisSession": "108",
"minutesPlayedTotal": "11113",
"powerLevel": 333,
"raceHash": 2803282938,
"genderHash": 2204441813,
"classHash": 671679327
}
}, {
"characterBase": {
这就是我认为你的意思 假设总是有一个字符带有classHash
。您可以筛选数组,弹出一个数组并获取其字符
characterId = data
.characters
.filter (character) -> character.characterBase.classHash is classHash
.pop()?.characterBase?.characterId
或者使用数组压缩
[characterId] = (id for {characterBase: {characterId: id, classHash: hash}} in data.characters when hash is classHash)
不确定实际数据是什么,但这里有一个。假设总是有一个字符带有classHash
。您可以筛选数组,弹出一个数组并获取其字符
characterId = data
.characters
.filter (character) -> character.characterBase.classHash is classHash
.pop()?.characterBase?.characterId
或者使用数组压缩
[characterId] = (id for {characterBase: {characterId: id, classHash: hash}} in data.characters when hash is classHash)
不确定实际数据是什么,但这里有一个。如果要根据变量classHash
的字符串值键入characterBase
,则需要使用[]
属性访问器,而不是像这样使用
数据.characters[0].characterBase[classHash]
。否则,你的问题是什么还不清楚。那没用。我将添加我正在处理的JSON对象的一部分。请解释a)您的代码正在做什么,b)您希望它做什么。从你问题中的描述一点也不清楚。我已经更新了这个问题。希望它能增加更多的清晰度…我很难弄清楚措辞。如果你想根据变量classHash
的字符串值键入characterBase
,那么你需要使用[]
属性访问器,而不是像这样使用
:data.characters[0]。characterBase[classHash]
。否则,你的问题是什么还不清楚。那没用。我将添加我正在处理的JSON对象的一部分。请解释a)您的代码正在做什么,b)您希望它做什么。从你问题中的描述一点也不清楚。我已经更新了这个问题。希望它能增加更多的清晰度…我很难弄清楚措辞。我喜欢reduce
的唯一原因是失败案例。理解示例处理这个案例<如果没有匹配项,则代码>字符ID将是未定义的。如果多个字符具有相同的哈希值,则为第一个匹配。我尝试了这两种方法,但均无效。第一个错误导致错误类型错误:无法读取未定义的
的属性“characterBase”;第二个错误导致错误语法错误:意外标记
。我对CoffeeScript非常陌生,所以我不知道我做错了什么。我在更新后尝试了第一种方法,现在characterId
是undefined@YuryTarabanko可以肯定的是,问题出在对象数组上,它的格式不正确(至少在我们回答的假设方面)。请参阅我的答案中的编辑。我之所以喜欢这里的reduce
更好(您也提到了这一点),唯一的原因是失败案例。理解示例处理此案例<如果没有匹配项,则代码>字符ID将是未定义的。如果多个字符具有相同的哈希值,则为第一个匹配。我尝试了这两种方法,但均无效。第一个错误导致错误类型错误:无法读取未定义的
的属性“characterBase”;第二个错误导致错误语法错误:意外标记
。我对CoffeeScript非常陌生,所以我不知道我做错了什么。我在更新后尝试了第一种方法,现在characterId
是undefined@YuryTarabanko可以肯定的是,问题出在对象数组上,它的格式不正确(至少在我们回答的假设方面)。请参阅编辑我的答案。@dkiefer我现在看到问题了,您的对象数组缺少右大括号。它有右大括号,我只是缩短了我从API返回的实际对象(大量数据)。@dkiefer好的,那么Yury和我的解决方案都应该可以正常工作,除非数据的结构不同,或者clashHash实际上是一个字符串,而不是一个数字或类似的东西。添加了一个演示。跑步时提醒角色。你是个天才。我甚至没有想到我需要将它转换成一个数字,因为它是JSON字符串的一部分。非常感谢你@dkiefer我现在看到问题了,你的对象数组缺少右大括号。它有右大括号,我刚刚缩短了我从API返回的实际对象(大量数据)。@dkiefer好吧,那么Yury和我的解决方案都应该可以正常工作,除非数据的结构不同,或者clashHash实际上是一个字符串,而不是一个数字或类似的东西。添加了一个演示。跑步时提醒角色。你是个天才。我甚至都没想到我会