urlMap = {
'0': {'6b4247404960fd4e418d242f3b7f0412': 'http://google.com', '123':'http://ibm.com'},
'1': {'4c27ffaef99b7a6dbe838b46bcc09779' : 'http://yahoo.com', '456':'http://abc.com'}
};
$(function() {
var l = new Array(1,2,3,4);
for (var i = 0; i < l.length; i++){
$("#"+i.toString()+".foo").change(function() {
g = i.toString();
window.location.href = urlMap[g][$(this).val()];
})}});
我尝试使用urlMap [i]它不起作用。当我硬编码urlMap ['0']时,它可以工作。
从Firebug,我看到了这个
urlMap[g] is undefined
[Break On This Error]
window.location.href = urlMap[g][$(this).val()];
我想如何查找字典?
感谢。
答案 0 :(得分:4)
很难说出你想要做什么。您有一个包含两个条目的地图,其中包含键"0"
和"1"
,但您有一个循环遍历值0,1,2和3,然后使用这些值查看在地图中的东西。
引用代码至少有三个问题:
您正在尝试访问仅包含密钥{{1}的对象的密钥"0"
,"1"
,"2"
和"3"
}和"0"
。
您正在循环中创建一个函数,该循环是变量"1"
的闭包,因此只会在之后看到i
的值然后调用闭包。这是因为闭包在变量中接收实时引用,而不是在创建变量时获取其值的副本。因此,所有i
处理程序函数都会尝试使用键click
(循环完成后"4"
的值),这在地图中不存在。
您没有在任何地方声明i
,因此成为The Horror of Implicit Globals的牺牲品。
这是我对你真正想要做的最好的猜测:
g
的变化:
我只尝试访问地图的元素urlMap = {
'0': {'6b4247404960fd4e418d242f3b7f0412': 'http://google.com', '123':'http://ibm.com'},
'1': {'4c27ffaef99b7a6dbe838b46bcc09779' : 'http://yahoo.com', '456':'http://abc.com'}
};
$(function() {
for (var i = 0; i < 2; i++){
$("#"+i.toString()+".foo").change(createHandler(i));
}
function createHandler(index) {
return function() {
window.location.href = urlMap[index][$(this).val()];
};
}
});
和"0"
,因为它们是唯一的元素。
我使用"1"
函数来确保我们创建的处理程序正在关闭createHandler
的{{1}}参数,而不是index
中的createHandler
值。环。 i
参数不会改变,而index
将(如我所述)随着循环的继续而改变。
我摆脱了i
,我们不需要,只是直接使用g
。属性名称始终字符串(even when the object is an "array");你索引到一个对象的任何时候,如果你提供的索引值是一个数字,它将变成一个字符串,所以你不必显式(尽管你可能,如果你愿意)。
答案 1 :(得分:1)
由于错误明确指出,urlMap[g]
不存在
你需要先创建它。