为什么我不能这样查找相关的数组?

时间:2012-02-05 23:28:26

标签: javascript

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()];

我想如何查找字典?

感谢。

2 个答案:

答案 0 :(得分:4)

很难说出你想要做什么。您有一个包含两个条目的地图,其中包含键"0""1",但您有一个循环遍历值0,1,2和3,然后使用这些值查看在地图中的东西。

引用代码至少有三个问题:

  1. 您正在尝试访问仅包含密钥{{1}的对象的密钥"0""1""2""3" }和"0"

  2. 您正在循环中创建一个函数,该循环是变量"1"的闭包,因此只会在之后看到i的值然后调用闭包。这是因为闭包在变量中接收实时引用,而不是在创建变量时获取其值的副本。因此,所有i处理程序函数都会尝试使用键click(循环完成后"4"的值),这在地图中不存在。

  3. 您没有在任何地方声明i,因此成为The Horror of Implicit Globals的牺牲品。

  4. 这是我对你真正想要做的最好的猜测:

    g

    的变化:

    1. 我只尝试访问地图的元素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",因为它们是唯一的元素。

    2. 我使用"1"函数来确保我们创建的处理程序正在关闭createHandler的{​​{1}}参数,而不是index中的createHandler值。环。 i参数不会改变,而index将(如我所述)随着循环的继续而改变。

    3. 我摆脱了i,我们不需要,只是直接使用g。属性名称​​始终字符串(even when the object is an "array");你索引到一个对象的任何时候,如果你提供的索引值是一个数字,它将变成一个字符串,所以你不必显式(尽管你可能,如果你愿意)。

答案 1 :(得分:1)

由于错误明确指出,urlMap[g]不存在 你需要先创建它。