Сопоставление нескольких ключей одному и тому же значению в хеше Javascript

Я использую хеш-объект 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.


person Matt Ball    schedule 24.03.2010    source источник


Ответы (5)


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

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]++;
}
person Zach    schedule 16.04.2010
comment
Хотя мне не нужно было реализовывать что-то подобное, я принимаю ваш ответ, потому что он кажется мне самым чистым и гибким. - person Matt Ball; 16.04.2010
comment
Мне нравится идея. Это было бы похоже на создание набора переменных внутри хэша. Это легко могло бы стать классом. - person Fabiano Soriani; 22.04.2010

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

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

myHash['A_prime'] = myHash['A'];
myHash['A_prime'].value++;
person Pindatjuh    schedule 24.03.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
person branchgabriel    schedule 24.03.2010

Вы можете действовать по ключу вместо хеша:

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

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

person Mic    schedule 24.03.2010

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

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

myHash[x] = 1;
myHash[y]++;  // should increment the value since y is x.
person roufamatic    schedule 24.03.2010
comment
JavaScript не может хранить объекты как ключи, только строки. Объект myHash будет заканчиваться свойством с именем "[object Object]", потому что оператор доступа к свойству [] преобразует x и y в строку. - person Christian C. Salvadó; 25.03.2010
comment
У меня есть контроль над хешем, но не над ключами. Мой вопрос в том, могу ли я делать то, что хочу, учитывая ограничения на мои ключи. - person Matt Ball; 25.03.2010
comment
Узнавайте что-то новое каждый день. - person roufamatic; 25.03.2010