Заменить буквы на цифры в js

947
09 августа 2017, 22:20

Мне надо поменять все буквы в строке по шаблону из массива. Начал, но не смог продолжить. Был идея перебором все буквы получить, но тогда скорость работы оставляла бы желать лучшего. В это коде я создаю переменную в массиве, в которую и будет записана новая строка:

array.forEach(function(item, i, arr) {
        arr[i]["__TMP__"] =
            stringTable.indexOf( item["name"].toString().charAt(0).toUpperCase() );
    });

Можно ли как-то это сделать с помощью replace?

template array:

stringTable: string[] = [
    "A",
    "B",
    "C",
    "D",
    "E",
    "F",
    "G",
    "H",
    "I",
    "J",
    "K",
    "L",
    "M",
    "N",
    "O",
    "P",
    "Q",
    "R",
    "S",
    "T",
    "U",
    "V",
    "W",
    "X",
    "Y",
    "Z"
];

input string: Tim outout string: 019008012 (019- t, 008- i, 012- m)

Answer 1

Вместо массива лучше использовать объект, в этом случае не нужен будет поиск, например

{
  "A": "000",
  "B": "001",
  "C": "002",
  "D": "003",
  "E": "004",
  "F": "005",
  "G": "006",
  "H": "007",
  "I": "008",
  "J": "009",
  "K": "010",
  "L": "011",
  "M": "012",
  "N": "013",
  "O": "014",
  "P": "015",
  "Q": "016",
  "R": "017",
  "S": "018",
  "T": "019",
  "U": "020",
  "V": "021",
  "W": "022",
  "X": "023",
  "Y": "024",
  "Z": "025"
}

Получение же нужной строки для замены сведется к простому получению свойства:

symbolsMap[char.toUpperCase()];

Это код можно использовать в функции, передаваемую в метод replace

var symbolsMap = { 
  "A": "000", 
  "B": "001", 
  "C": "002", 
  "D": "003", 
  "E": "004", 
  "F": "005", 
  "G": "006", 
  "H": "007", 
  "I": "008", 
  "J": "009", 
  "K": "010", 
  "L": "011", 
  "M": "012", 
  "N": "013", 
  "O": "014", 
  "P": "015", 
  "Q": "016", 
  "R": "017", 
  "S": "018", 
  "T": "019", 
  "U": "020", 
  "V": "021", 
  "W": "022", 
  "X": "023", 
  "Y": "024", 
  "Z": "025", 
   
  "Р": "-11", 
  "Ы": "-21", 
  "К": "-31" 
} 
 
var str = "Tim"; 
var numbers = str.replace(/./gi,$0=>symbolsMap[$0.toUpperCase()]||$0); 
console.log(numbers); 
 
var str = "рык"; 
var numbers = str.replace(/./gi,$0=>symbolsMap[$0.toUpperCase()]||$0); 
console.log(numbers);

Answer 2

Если правильно понял вопрос то можно попробовать так.

function pad(num, size) { 
    var s = num+""; 
    while (s.length < size) s = "0" + s; 
    return s; 
} 
 
let input = 'Tim' 
let inputLower = input.toLowerCase(); 
let output = ''; 
for (let i = 0; i < inputLower.length; i++) { 
    output += pad(inputLower[i].charCodeAt(0) - 97, 3); 
} 
console.log(output);

Answer 3

Вот такой код вышел, используем не массив а charAt + отлавливаем ошибки если пользователь ввел не английские буквы.

document.querySelector("button").onclick = function() { 
  var inputText = (document.querySelector(".text-in").value).toLowerCase(); 
  var outText = ""; 
  if (inputText != "") { 
    inputText = inputText.split(''); 
    for (var i = 0, inputTextL = inputText.length; i < inputTextL; i++) { 
      var num = (inputText[i].charCodeAt(0)) - 96; 
      if (num < 1 || num > 26) { 
        document.querySelector(".text-in").value = "English word, please!"; 
        return; 
      } 
      if (num < 9) { 
        outText = outText + "00" + num; 
      } else { 
        outText = outText + "0" + num; 
      } 
    } 
    document.querySelector(".text-in").value = outText; 
  } 
}
<input type="text" class="text-in"> 
<button>Зашифровать</button>

Answer 4

String.prototype.replaceAll = function(replacement) { 
  var _this = this; 
 
  replacement.forEach(function(element, index) { 
    var re = new RegExp(element, "gi"); 
 
    _this = _this.replace(re, "000".substring(0, "000".length - index.toString().length) + index.toString()); 
  }); 
 
  return _this; 
}; 
 
var originalString = "Hello Привет 007!!!"; 
var newString = originalString.replaceAll(['h', 'e', 'l', 'п', 'р', 'и', '!', 'в', 'е', 'т', 'o']); 
 
console.log(originalString + " -> " + newString);

Для данного кода важно, чтобы среди символов для замены ['h', 'e', 'l', 'п', 'р', 'и', '!', 'в', 'е', 'т', 'o'] не было чисел. Если будут числа — напишите, пожалуйста, вопрос более развернуто со всеми условиями. От этого будет зависить решение.

P.S.: Если будут числа: можно сначала регулярным выражением числа заменить, а потом остальные символы. Потому что, если мы сначала в строке заменим символы, а затем начнем заменять числа — в строке как бы появятся ещё числа...

READ ALSO
Сделать код синхронным

Сделать код синхронным

Помогите сделать код синхронным

369
You may need an appropriate loader to handle this file type

You may need an appropriate loader to handle this file type

Вылетает ошибка в webpack при попытке срендерить этот код:

686
Как взять высоту одного блока и присвоить её другому? jQuery

Как взять высоту одного блока и присвоить её другому? jQuery

Собственно нужно брать высоту одного блока и при загрузке документа присваивать его другомуКак это можно реализовать ?

545
Проблема с cdn от yandex

Проблема с cdn от yandex

Есть сайтНа нём до меня подключали скрипты от cdn yandex'a

341