为什么我不能像这样查找关联的数组

How come I can't lookup associated array like this?

本文关键字:关联 数组 查找 像这样 不能 为什么      更新时间:2023-09-26
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']进行硬编码时,它可以工作。

从萤火虫,我看到这个

urlMap[g] is undefined
[Break On This Error]   
window.location.href = urlMap[g][$(this).val()];

我应该如何查找字典?

谢谢。

很难说你想做什么。您有一个包含两个条目的映射,键分别为 "0""1" ,但您有一个循环遍历值 0、1、2 和 3,然后使用这些值在映射中查找内容。

引用的代码至少存在三个问题:

  1. 您正在尝试访问仅具有键"0""1"的对象的键"0""1""2""3"

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

  3. 你没有在任何地方宣布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()];
       };
    }
});

变化:

  1. 我只尝试访问地图"0""1"的元素,因为这些是它拥有的唯一元素。

  2. 我使用 createHandler 函数来确保我们创建的处理程序关闭index参数以createHandler,而不是循环中的i值。index参数不会改变,而i(如我所提到的(会随着循环的继续而改变。

  3. 我摆脱了我们不需要的g,直接使用index。属性名称始终是字符串(即使对象是"数组"(;任何时候你索引到一个对象,如果你提供的索引值是一个数字,它就会变成一个字符串,所以你不必显式地这样做(尽管如果你愿意,你可以这样做(。

正如错误明确指出的那样,urlMap[g]不存在。
您需要先创建它。