Отображение нескольких ключей на одно и то же значение в хэше Javascript - PullRequest
1 голос
/ 25 марта 2010

Я использую хеш-объект Javascript для хранения набора числовых счетчиков, настроенных следующим образом [это значительно упрощается]:

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

Есть ли способ сделать другие ключи, явно не указанные в myHash, сопоставленными с ключами, которые есть? Например, я хотел бы [снова, это упрощено]:

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

должно быть в точности эквивалентно

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

например. увеличивая значение, найденное в ключе A, а не A_prime.

Ответы [ 5 ]

1 голос
/ 16 апреля 2010

Предполагая, что в этом хэше нет допустимых строковых значений, вы можете создать собственное отображение ключей на другие ключи внутри самого хэша и обернуть пары ключ / значение в свою собственную функцию следующим образом:

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]++;
}
1 голос
/ 25 марта 2010

Один из способов решения этой проблемы - обернуть все значения в объекте и использовать этот объект в нескольких ключах.

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

myHash['A_prime'] = myHash['A'];
myHash['A_prime'].value++;
0 голосов
/ 25 марта 2010

Вы можете использовать ключ вместо хеша:

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

Функция incr может быть чем угодно, что вы хотите применить к хешу.

0 голосов
/ 25 марта 2010

Я думаю, что было бы лучше, если бы вы просто написали функцию для выполнения увеличения одного или нескольких хеш-массивов в зависимости от того, что вы пытаетесь выполнить. Возможно, я не правильно понял вопрос, но это мое решение.

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
0 голосов
/ 25 марта 2010

Как описано, нет. Если вы можете изменить свои ключи на объекты, хотя вы стали бы ближе:

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

myHash[x] = 1;
myHash[y]++;  // should increment the value since y is x.
...