@Jungmannen

Как в строке JS заменить нужные символы на случайный аналог из заданного массива?

Я делаю свой простой метод преобразования строки на JS, чтобы он подгружался прямо на сайте и выполнял простые действия:
1. Получал от пользователя строку
2. Разбивал строку посимвольно
3. Латинские символы заменял на случайный символ из массива, который для каждой буквы отдельный. Цифры остаются теми же на тех же местах, что и были
4. Возвращает пользователю результат.

В процессе работы я наткнулся на неприятную проблему: при вызове функции, которая заменяла бы символ на соответствующий из массива, она воспринимает её название, которое подгружается из строки, как строку. Ясное дело, тип данных разный, но понял я это не сразу. Соответственно вместо замены символа на другой, он воспринимает принимаемый символ уже как массив с одним элементом -- символом, и просто берет тот же символ и вставляет его в результат. В итоге на выходе я получаю ту же строку , что и вводил.

Могу ли я как-то дать понять функции, что я беру именно массив с таким названием, а не загружаю в неё строку?
  • Вопрос задан
  • 126 просмотров
Решения вопроса 2
XanXanXan
@XanXanXan
spoiler
const charDict = {
  a: ['∀', '₳', 'Ä'],
  b: ['Ᏸ', 'β', '฿', 'ß'],
  c: ['ℭ', 'Ç', 'Ꮸ', '₡'],
  d: ['Ɗ', 'Ď', 'Đ'],
  e: ['£', 'Ē', 'ξ', 'Ê', 'È', '€', 'É', '∑', 'Ế', 'Ề', 'Ể', 'Ễ'],
  f: ['ℱ', '₣', 'ƒ', '∮', 'Ḟ', 'ჶ'],
  g: ['Ꮹ', 'Ꮆ', 'Ǥ', '₲'],
  h: ['ℍ', 'ℋ', 'ℌ', 'ዙ', 'Ĥ', 'Ħ'],
  i: ['ℐ', 'ℑ', 'Ï'],
  j: ['ჟ', 'Ĵ'],
  k: ['₭', 'Ꮶ', 'Ќ', 'Ķ', 'Ҝ', 'ﻸ'],
  l: ['ℒ', 'ℓ', 'Ŀ', '£', 'λ', '₤', 'Ł', 'Ꮭ', '£', 'Ꮑ'],
  m: ['ℳ', 'ʍ', 'Ḿ', '爪'],
  n: ['ℕ', 'η', 'Ñ', 'Ŋ', 'Ń', 'ℵ', '₦'],
  o: ['ტ', 'Ǿ', 'Θ', 'Ø', 'Ό', 'Ở', 'Ờ', 'Ớ', 'Ổ'],
  p: ['ℙ', '℘', 'þ', '尸', 'Ҏ', '₱'],
  q: ['ℚ', 'Q', 'Q'],
  r: ['ℝ', 'ℜ', 'ℛ', '℟', 'ჩ', 'Ꮢ', '尺'],
  s: ['Ꮥ', 'Ṧ', 'ى', '§', 'Ś', 'Ŝ', '₰', '∫', '$', 'ֆ'],
  t: ['₸', '†', 'T', 'Ţ', 'Ŧ', 'ィ', '干', 'Ṫ', 'テ', '₮'],
  u: ['∪', 'Ũ', '⋒', 'Ủ', 'Ừ', 'Ử', 'Ữ', 'Ự', 'Џ'],
  v: ['∨', '√', 'Ꮙ', 'Ṽ', '/', '℣'],
  w: ['₩', 'Ẃ', 'Ẁ', 'ώ', 'ω', 'Ŵ', 'Ꮤ', 'Ꮃ', 'ฬ', 'Ẅ', 'ѡ', 'Ꮚ', 'Ꮗ', 'ผ', 'ฝ', 'พ', 'ฟ'],
  x: ['χ', 'ჯ', 'Ẍ', 'ẍ', 'ᶍ'],
  y: ['ɣ', 'Ꭹ', 'Ꮍ', 'Ẏ', 'ẏ', 'ϒ', 'ɤ', '¥', 'り'],
  z: ['ℤ', 'ℨ', 'ჳ', '乙', 'Ẑ', 'ẑ', 'ɀ', 'Ꮓ']
}
function replaceChars(str) {
  return str.split('').map(char => {
    char = char.toLowerCase();
    return (char in charDict) ? charDict[char][Math.floor(Math.random() * charDict[char].length)] : char;
  }).join('');
}
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
const symbols = 'фывап'; // ваши символы
const rnd = () => symbols[Math.floor(Math.random() * symbols.length)]; // получить случайный символ
const re = /\D/g; // регулярка, ищущая любые не цифровые символы

const magic = str => str.replace(re, rnd); // вот и все!

https://jsfiddle.net/p25gzre9/
UPD: увидел в комментариях, что для каждого символа своя замена. Сейчас подправлю
вместо
str.replace(re, rnd);

вызываем функцию, которая сперва выбирает массив замен по букве, а потом выбирает из них случайную
str.replace(re, retReplace);
https://jsfiddle.net/p25gzre9/2/

function getReplace() довольно длинная

function getReplace(key) {
  const allSymbols = {
    a:  ['∀', '₳', 'Ä'],
    b:  ['Ᏸ', 'β', '฿', 'ß'],
    c:  ['ℭ', 'Ç', 'Ꮸ', '₡'],
    d:  ['Ɗ', 'Ď', 'Đ'],
    e:  ['£', 'Ē', 'ξ', 'Ê', 'È', '€', 'É', '∑', 'Ế', 'Ề', 'Ể', 'Ễ'],
    f:  ['ℱ', '₣', 'ƒ', '∮', 'Ḟ', 'ჶ'],
    g:  ['Ꮹ', 'Ꮆ', 'Ǥ', '₲'],
    h:  ['ℍ', 'ℋ', 'ℌ', 'ዙ', 'Ĥ', 'Ħ'],
    i:  ['ℐ', 'ℑ', 'Ï'],
    j:  ['ჟ', 'Ĵ'],
    k:  ['₭', 'Ꮶ', 'Ќ', 'Ķ', 'Ҝ', 'ﻸ'],
    l:  ['ℒ', 'ℓ', 'Ŀ', '£', 'λ', '₤', 'Ł', 'Ꮭ', '£', 'Ꮑ'],
    m:  ['ℳ', 'ʍ', 'Ḿ', '爪'],
    n:  ['ℕ', 'η', 'Ñ', 'Ŋ', 'Ń', 'ℵ', '₦'],
    o:  ['ტ', 'Ǿ', 'Θ', 'Ø', 'Ό', 'Ở', 'Ờ', 'Ớ', 'Ổ'],
    p:  ['ℙ', '℘', 'þ', '尸', 'Ҏ', '₱'],
    q:  ['ℚ', 'Q', 'Q'],
    r:  ['ℝ', 'ℜ', 'ℛ', '℟', 'ჩ', 'Ꮢ', '尺'],
    s:  ['Ꮥ', 'Ṧ', 'ى', '§', 'Ś', 'Ŝ', '₰', '∫', '$', 'ֆ'],
    t:  ['₸', '†', 'T', 'Ţ', 'Ŧ', 'ィ', '干', 'Ṫ', 'テ', '₮'],
    u:  ['∪', 'Ũ', '⋒', 'Ủ', 'Ừ', 'Ử', 'Ữ', 'Ự', 'Џ'],
    v:  ['∨', '√', 'Ꮙ', 'Ṽ', '\\/', '℣'],
    w:  ['₩', 'Ẃ', 'Ẁ', 'ώ', 'ω', 'Ŵ', 'Ꮤ', 'Ꮃ', 'ฬ', 'Ẅ', 'ѡ', 'Ꮚ', 'Ꮗ', 'ผ', 'ฝ', 'พ', 'ฟ'],
    x:  ['χ', 'ჯ', 'Ẍ', 'ẍ', 'ᶍ'],
    y:  ['ɣ', 'Ꭹ', 'Ꮍ', 'Ẏ', 'ẏ', 'ϒ', 'ɤ', '¥', 'り'],
    z:  ['ℤ', 'ℨ', 'ჳ', '乙', 'Ẑ', 'ẑ', 'ɀ', 'Ꮓ'],
  };
  const symbols = allSymbols[key];
  return symbols[Math.floor(Math.random() * symbols.length)];
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы