views:

184

answers:

5

I use a Javascript hash object to store a set of numerical counters, set up like this [this is greatly simplified]:

var myHash = {
    A: 0,
    B: 0,
    C: 0
};

Is there a way to make other keys, ones not explicitly in myHash, map to keys that are? For instance, I'd like [again, this is simplified]:

myHash['A_prime']++; // or myHash.A_prime++;

to be exactly equivalent to

myHash['A']++; // or myHash.A++;

e.g. incrementing the value found at the key A, not A_prime.

A: 

A way of solving this would be wrapping all values in an object, and use this object in several keys.

var myHash = {
    A: {value: 0},
    ...
};

myHash['A_prime'] = myHash['A'];
myHash['A_prime'].value++;
Pindatjuh
A: 

As described, no. If you can change your keys to objects though you'd get closer:

var x = new Object();
var y = x;

myHash[x] = 1;
myHash[y]++;  // should increment the value since y is x.
roufamatic
JavaScript can't hold objects as keys, only strings. The `myHash` object will end with a property named `"[object Object]"` because the `[]` property accessor operator will convert `x` and `y` to String.
CMS
I have control over the hash, but not the keys. My question is whether I can do what I want, given the constraints on my keys.
Matt Ball
Learn something new every day.
roufamatic
A: 

I think you would be better off just writing a function to accomplish the incrementation of one hash array or multiple depending on what you are trying to accomplish. I may have not understood the question correctly but this is my solution.

var smallHash = { 
    A: 0, 
    B: 0, 
    C: 0,
    A_prime:'A',
    B_prime:'B',
    C_prime:'C'
}; 

function incrementPrime(myHash,key)
{
  letterKey = myHash[key];
  myHash[letterKey]++;
}

incrementPrime(smallHash,'C_prime');

alert("C is now: "+smallHash['C']); // should return 1
mugafuga
A: 

You could act on the key, instead of the hash:

var myHash = {
    A: 0,
    B: 0,
    C: 0
};
function incr(prop){
    myHash[prop[0]]++;
}
incr('A');
incr('A_asdf');

The function incr could be anything else you want to apply to the hash.

Mic
+1  A: 

Assuming there aren't any valid string values in this hash, you could create your own mapping of keys to other keys, within the hash itself, and wrap the key/value pairs in your own function, as follows:

var hash = {
    A: 0,
    B: 0,
    C: 0,
    A_asdf: 'A',
    B_asdf: 'B',
    A_another: 'A'
}

function increment(key)
{
    // iteratively find the real key
    while (typeof(hash[key]) == 'string')
    {
        key = hash[key];
    }
    hash[key]++;
}
Zach
While I ended up not needing to implement something like this, I'm accepting your answer because it seems the cleanest and most flexible to me.
Matt Ball
I like the idea, It would be like making a set of vars inside a hash.. That could easily become a Class
Fabiano PS