如何在javascript中使用复杂的关联数组?

时间:2010-12-21 04:13:33

标签: javascript arrays dictionary associative

我的程序中需要这个表http://code.google.com/apis/chart/docs/gallery/qr_codes.html#details,我甚至不确定是否可以使用关联数组。

鉴于类型(数字/字母数字),字符数和EC(纠错)级别,我想要一个函数来返回版本(第一列)。

1 个答案:

答案 0 :(得分:8)

首先,JavaScript有“数组”和“对象”。通过'associative array',我假设你的意思是一个JavaScript对象,使用非负整数以外的键。

您可以使用以下语法创建JavaScript对象文字:

var versions = {
  "1" : {
    rowcols : [21,21],
    charsByECLevel : {
      L : {
        digits:41,
        alpha:25
      },
      M : {
        digits:34,
        alpha:20
      }
    }
  },
  "2" : {
    rowcols : [25,25],
    charsByECLevel : {
      L : {
        digits:77,
        alpha:47
      },
      M : {
        digits:63,
        alpha:48
      }
    }
  }
};

然后您将访问属性,如下所示:

console.log( versions[1].charsByECLevel.L.digits );
// 41

要遍历这些值,您可以这样做:

function findVersion( versions, level, digits ){
  for (var versionNumber in versions){
    if (versions.hasOwnProperty(versionNumber)){
      if (versions[versionNumber].charsByECLevel[level].digits == digits){
        return versionNumber;
      }
    }
  }
}

findVersion( versions, "L", 77 );
// returns "2"

编辑:编写完上述内容后,如果想要根据级别和数字查找版本,则应该反转哈希值。而不是循环并检查版本,直接索引它们并在恒定时间内查找它:

var versionByLevelAndDigits = {
  L : {
     41 : 1,
     77 : 2,
    127 : 3
  },
  M : {
     34 : 1,
     63 : 2,
    101 : 3
  }
};

var version = versionByLevelAndDigits["L"][77];
// 2