Как использовать сложный ассоциативный массив в JavaScript? - PullRequest
2 голосов
/ 21 декабря 2010

Мне нужна эта таблица http://code.google.com/apis/chart/docs/gallery/qr_codes.html#details в моей программе, и я даже не уверен, подходит ли ассоциативный массив.

Учитывая тип (числовой / буквенно-цифровой), числосимволы и уровень EC (исправление ошибок), я хочу, чтобы функция возвращала версию (первый столбец).

1 Ответ

8 голосов
/ 21 декабря 2010

Во-первых, JavaScript имеет «Массивы» и «Объекты». Под «ассоциативным массивом» я предполагаю, что вы имеете в виду объект 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
...