2010-03-24 47 views
1

我使用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

回答

1

假设此散列中没有任何有效的字符串值,您可以在散列本身内创建您自己的映射到其他键的自己的映射,并将键/值对包装在您自己的函数中,如下所示:

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]++; 
} 
+0

虽然我最终不需要实现这样的事情,但我接受你的答案,因为它对我来说似乎是最干净和最灵活的。 – 2010-04-16 14:07:20

+0

我喜欢这个想法,它会像在一个哈希里面制作一组变量。这很容易成为一个类 – 2010-04-22 14:58:17

1

解决此问题的一种方法是将所有值包装在一个对象中,并在几个键中使用此对象。

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

myHash['A_prime'] = myHash['A']; 
myHash['A_prime'].value++; 
-1

如上所述,没有。如果你可以改变你的钥匙对象,虽然你会得到更接近:

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

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

JavaScript不能将对象保存为键,只能是字符串。因为'[]'属性访问器操作符会将'x'和'y'转换为String,'myHash'对象将以一个名为'[object Object]'的属性结束。 – CMS 2010-03-24 21:33:00

+0

我可以控制哈希,但不是键。我的问题是,鉴于我的钥匙受到限制,我是否可以做我想做的事。 – 2010-03-24 21:36:59

+0

每天学习新东西。 – roufamatic 2010-03-24 23:57:31

0

我想你会过得更好只是写一个函数来完成一个散列阵列的增量或多个取决于你正在努力完成。我可能没有正确理解这个问题,但这是我的解决方案。

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

你可以采取行动,而不是哈希的关键,:

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

功能incr可能是其他任何你想申请的哈希值。