dkiefer
dkiefer

Reputation: 511

In CoffeeScript, how do I get a value from an object based on another value matching a variable?

I'm working on a bot for my team's Slack and so far my searches have come up empty. I'm retrieving a JSON object from an API, and it is returning fine. What I'm trying to do is get the value of the property of an element of the object based on if another property matches a variable being passed in to the function. In more detail, I'm trying to retrieve the characterId based on the classHash. I'm trying this, but it's not working. It results in characterId being undefined.

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

The JSON object is as follows:

"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}
                 }

I am trying to get the characterId of characters[].characterBase where the characters[].characterBase.classHash equals the one passed in. Say I pass in 2271682572 as the classHash, I want to return the characterId that matches that classHash, in this case 2305843009322984539

Can anyone help me or point me in the right direction?

Upvotes: 0

Views: 137

Answers (2)

Jared Smith
Jared Smith

Reputation: 21965

Assuming that characterIDs are unique:

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)

You will either get back the characterId, or null if a match isn't found.

Example:

getCharIdByClassHash(data.characters, 2271682572) # 2305843009322984539

EDIT

this assumes your 'json' is NOT

"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": {

Like you wrote it but is

"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": {

Which is what I think you meant. Demo.

Upvotes: 1

Yury Tarabanko
Yury Tarabanko

Reputation: 45121

Assuming there is always one character with classHash. You can filter array, pop one and get its character

characterId = data
 .characters
 .filter (character) -> character.characterBase.classHash is classHash
 .pop()?.characterBase?.characterId

Or using array comprehesion

[characterId] = (id for {characterBase: {characterId: id, classHash: hash}} in data.characters when hash is classHash)

Not sure what your actuall data is but here is a demo.

Upvotes: 1

Related Questions