0

I'm using an object as a map and storing objects in it using the pattern map[obj.href] = obj

I'm expecting duplicate keys, but something really weird is happening:

I have 2 completely different (every field) objects stored with different keys, but when a 3rd object has the same key as 1st, a lookup is returning the 2nd object (stored with a different key), and when I do a lookup of the returned object's href, I get that same object again, as if the 2 keys are equivalent.

According to Which characters are valid/invalid in a JSON key name? and some other posts on SO, any valid string can be a key in an object, and you don't need to escape any characters, which I was worried about because of all the '/'s and '#'s.

I'm sureit's just a simple bug in my code, which I can't see it because it's 8 am and I have been up all night. Any help spotting it would be appreciated.

function parseSpellsList($)
{
    var spellsList = {};

     $("ul[class|='link'],ul[class$='level']").each(function() {
        var obj, spell_type, links, i, link, a, span, prevObj, hashKey;
        obj = {};
        links = this.children;
        for (i=0; i<links.length; i++) {
            link = links[i];
            a = link.children[0];
            obj.href = a.href.replace("file:///home/ckot/rpg_app/", "").replace("scripts/", "");
            obj.name = a.innerHTML.replace("<b>", "").replace("</b>", "");
            hashKey = obj.href;
            prevObj = null;
             if ( !(spellsList.hasOwnProperty(hashKey))) {
                 // debug code
                if ("Blood Blaze" === obj.name || "Vomit Swarm" === obj.name) {
                    console.log("storing " + JSON.stringify(obj, null, "    ") + " with hashKey: " + hashKey);
                }
                spellsList[hashKey] = obj;
            } else {
                console.log("\nWARNING: hashKey " + hashKey + " already exists");
                prevObj = spellsList[hashKey];
                console.log("object we which to store with hashKey: " + hashKey + "\n" + JSON.stringify(obj, null, "    ")) ;
                console.log("object retrieved with hashKey: " + hashKey + "\n" + JSON.stringify(prevObj, null, "    "));
                console.log("object retrieved with hashKey: " + prevObj.href + "\n" + JSON.stringify(spellsList[prevObj.href], null, "    ") + "\n");
            }
        }
    });
}

when I run it I get the following output:

storing {
    "href": "advancedRaceGuide/featuredRaces/orcs.html#blood-blaze",
    "name": "Blood Blaze"
} with hashKey: advancedRaceGuide/featuredRaces/orcs.html#blood-blaze
storing {
    "href": "advanced/spells/vomitSwarm.html#vomit-swarm",
    "name": "Vomit Swarm"
} with hashKey: advanced/spells/vomitSwarm.html#vomit-swarm

WARNING: hashKey advancedRaceGuide/featuredRaces/orcs.html#blood-blaze already exists
object we which to store with hashKey: advancedRaceGuide/featuredRaces/orcs.html#blood-blaze
{
    "href": "advancedRaceGuide/featuredRaces/orcs.html#blood-blaze",
    "name": "Blood Blaze"
}
object retrieved with hashKey: advancedRaceGuide/featuredRaces/orcs.html#blood-blaze
{
    "href": "advanced/spells/vomitSwarm.html#vomit-swarm",
    "name": "Vomit Swarm"
}
object retrieved with hashKey: advanced/spells/vomitSwarm.html#vomit-swarm
{
    "href": "advanced/spells/vomitSwarm.html#vomit-swarm",
    "name": "Vomit Swarm"
}

EDIT:

just for some context I'm using: node v0.10.22 npm v1.4.24 and the npm modules: jsdom v1.0.0-pre.3 jquery v2.1.1",

Community
  • 1
  • 1
ckot
  • 819
  • 2
  • 10
  • 23
  • Try creating a testenvironment you can share. Good platforms are liveweave.com, codepen.io and jsfiddle.net – Mx. Aug 26 '14 at 12:25
  • @Max I had to use cloud9 unfortunately because I needed a node js environment. I can't explicity share except with cloud9 usernames or email addresses, however I can approve people manually as they connect to https://ide.c9.io/ckot/ckotz_node_playground you just need to run ./parseSpellList at the command line – ckot Aug 26 '14 at 14:05

1 Answers1

0

nvm, I was initializing obj at the start of $.each() instead of inside the nested for loop. :(

i guess I just need to get some sleep.

ckot
  • 819
  • 2
  • 10
  • 23