1

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.

5 Answers 5

2

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]++;
}
Sign up to request clarification or add additional context in comments.

2 Comments

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.
I like the idea, It would be like making a set of vars inside a hash.. That could easily become a Class
2

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++;

Comments

0

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

Comments

0

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.

Comments

-1

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.

3 Comments

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.
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.
Learn something new every day.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.