Нечто маленькое и неоспоримое на этой неделе, когда мы рассмотрим простой, но гибкий метод подсчета с произвольным набором символов. Это не то, что вам может понадобиться очень часто; но когда вы это сделаете, вы обнаружите, что ни одна из встроенных в JavaScript функций не предназначена для этого.
В JavaScript есть встроенные функции для разбора и преобразования чисел между различными числовыми базами. Например, метод parseInt
может работать с любым основанием (числовой базой) от 2
до 36
и обычно используется для преобразования чисел и подсчета в недесятичной основе. Метод Number.toString
может ответить взаимностью, преобразовав десятичные числа обратно в недесятичные строки:
var character = "2F"; alert(parseInt(character, 16)); //alerts 47 var number = 47; alert(number.toString(16)); //alerts "2F";
Но что, если вы хотите считать с помощью чисел клингона? Или, скорее, возможно, используя греческие или кириллические буквы, иероглифы или какие-то руны? Техника, которую я собираюсь продемонстрировать, может сделать именно это на любой числовой основе; и чтобы проиллюстрировать это полностью, я покажу вам несколько примеров работы с заглавными греческими буквами в шестнадцатеричном формате (основание 16).
Это все в лексиконе
Поэтому самое первое, что нам нужно сделать, это определить лексикон , который представляет собой словарь символов, которые мы будем использовать, определяемый как одна строка escape-последовательностей Юникода. В этом случае у нас есть 16 греческих букв в верхнем регистре от Alpha до Pi — каждая цифра представлена буквой, а длина всей строки определяет числовую базу:
var lexicon = "u0391u0392u0393u0394u0395u0396u0397u0398u0399u039au039bu039cu039du039eu039fu03a0";
Последовательность побега — один персонаж
Стоит отметить, что, хотя для определения escape-последовательности Юникода требуется шесть типизированных символов, он по-прежнему отображается только как один символ в строке, и поэтому длина лексикона составляет 16 символов.
Получив лексикон, мы можем ссылаться на символ по числовому индексу, используя String.charAt
, и наоборот, получить числовой индекс символа, используя String.indexOf
:
var number = lexicon.indexOf("u0398"); //the decimal equivalent of "Θ" var character = lexicon.charAt(7); //the character equivalent of 7
Поэтому любые вычисления, которые мы делаем, будут основаны на этих двух методах. Например, давайте определим for
-loop, который выполняется для итераций "Κ"
, и перечисляет каждый промежуточный символ:
var str = ""; for(var i=0; i<lexicon.indexOf("u039a"); i++) { str += lexicon.charAt(i) + "n"; } alert(str);
Но как быть с большими числами, скажем, отображающими символ, эквивалентный 23
? Нам просто нужно извлечь отдельные цифры, а затем взять символьные эквиваленты, в данном случае 2
и 3
:
var target = 23; var conversion = lexicon.charAt(Math.floor(target / 10)) + lexicon.charAt(target % 10); alert(conversion);
Просто чтобы сделать вещи действительно интересными, что, если число, которое мы хотим преобразовать, содержит буквы, а также цифры, такие как шестнадцатеричное число "2F"
? В этом случае мы должны были бы преобразовать каждую цифру индивидуально, потому что мы не можем ссылаться на символ по шестнадцатеричному индексу ( то есть lexicon.charAt("F")
должен был бы стать lexicon.charAt(15)
):
var target = "2F"; var conversion = lexicon.charAt(parseInt(target.charAt(0), 16)) + lexicon.charAt(parseInt(target.charAt(1), 16)); alert(conversion);
Конечно, последние два примера довольно просты, потому что число цифр известно; но было бы нетрудно адаптировать процесс для перебора столько цифр, сколько содержит число. Все компоненты, которые вам нужны, находятся здесь, это всего лишь случай их адаптации для ваших конкретных требований.
Это данные, которые имеют значение!
Как это бывает, вы можете использовать точно такой же подход для подсчета, используя обычные латинские цифры и буквы, если возникнет такая необходимость. А расширяемая природа лексикона означает, что вы можете использовать его для расширения собственных возможностей JavaScript до оснований, превышающих 36
, с любыми символами, которые кажутся подходящими в то время.
Или, может быть, просто разработать несколько классных часов!
Если вы хотите узнать больше от Джеймса, подпишитесь на нашу еженедельную техническую новостную рассылку Tech Times .