Функция "перевести" в javascript, как в php?

Да, я хочу, чтобы в javascript была функция «перевод» символов, как в php. Я сделал следующее, но это ужасно. Наверняка должен быть способ лучше - использовать регулярные выражения?

<html>
<head>
<script>
window.onload = function() { 
  "use strict";
  console.info(translate("abcdefg", "bdf", "XYZ")); // gives aXcYeZg -=-=-
}
function translate(v1, xlatfrom, xlatto) {
  var ch, ipos, retstr = "";
  if (xlatfrom.length != xlatto.length) return ""; // lengths must be =
  for (var i1=0; i1<v1.length; i1+=1) { // go through string
    ch = v1.substring(i1, i1+1); // character by character
    ipos = xlatfrom.indexOf(ch); // ck if in xlatfrom
    if (ipos >= 0) ch = xlatto.substring(ipos, ipos+1); // if yes, replace
    retstr += ch; } // build up return string
  return retstr;
}
</script>
</head>
<body>
</body>
</html>

Обновлено: я принял ответ @ dani-sc. Я не собираюсь гоняться за выступлениями. Но это так ДИДАКТИЧНО! И спасибо за информацию о "операторе распространения". Вот как я могу использовать его ответ:

function translate(v1, xlatfrom, xlatto) { // like the PHP translate
 var mapobj = strsToObject(xlatfrom, xlatto); // make str1.ch's:str2ch's object
 return [...v1].map(ch => mapobj[ch] || ch).join(''); // ... is js "spread operator"
}
function strsToObject(str1, str2) { // make object from strings
  if (str1.length != str2.length) return {}; // lengths must be =
  var retobj = {};
  for (var i1=0; i1<str1.length; i1+=1) { // just str[i1]: str2[i1]
    retobj[str1.substring(i1, i1+1)] = str2.substring(i1, i1+1); }
  return retobj;
}

или (это ОТЛИЧНО! СПАСИБО!)

function translate(v1, xlatfrom, xlatto) { // like the PHP translate
  if (xlatfrom.length != xlatto.length) return ""; // lengths must be =
  var mapobj = {}; // make object for mapping
  for (var i1=0; i1<xlatfrom.length; i1+=1) { // just str[i1]: str2[i1]
    mapobj[xlatfrom.substring(i1, i1+1)] = xlatto.substring(i1, i1+1); }
  return [...v1].map(ch => mapobj[ch] || ch).join(''); // ... is js "spread operator"
}

Что-то вроде ответов в этот вопрос может быть тем, что вы ищете

Hamms 07.05.2018 23:53

@Hamms Спасибо, мои поиски не попали в "функцию Perl tr". Там много всего.

dcromley 08.05.2018 03:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
522
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

function translate(val, xlatfrom, xlatto) { // 
  if (xlatfrom.length !== xlatto.length) return "";
  
  Array.from(xlatfrom).forEach((key, index) =>  {
    val = val.replace(key, xlatto[index]);
  })
  return val;
}

console.info(translate("abcdefg", "bdf", "XYZ"));

Это страдает (я думаю) той же проблемой, что и @ dani-sc, "translate (" abcdefg "," cde "," dxx ")" дает "abxdxfg" вместо "abdxxfg", чего я хотел бы. Я собираюсь посмотреть на это подробнее. Спасибо.

dcromley 08.05.2018 03:18

Это не работает, если буквы в xlatfrom и xlatto совпадают.

Bergi 08.05.2018 11:58

@Bergi Полные спецификации для этой функции не упоминаются. Итак, у меня остался один вариант: зацикливаться на коде php translate () и конвертировать его в javascript. У меня не так много времени :)

Zohaib Ijaz 08.05.2018 13:10
Ответ принят как подходящий

Что ж, если хотите, вы можете использовать такие регулярные выражения:

function translate(input, oldCharacters, newCharacters) {
  let output = input;
  const oldChArr = [...oldCharacters];
  const newChArr = [...newCharacters];
  for (let i = 0; i < oldChArr.length; i += 1) {
    output = output.replace(new RegExp(oldChArr[i], 'g'), newChArr[i]);
  }
  return output;
}

function translateFixed(input, replacements) {
  return input.replace(/./g, ch => replacements[ch] || ch);
}

function translateFixedNoRegEx(input, replacements) {
  return [...input].map(ch => replacements[ch] || ch).join('');
}

console.info(translate("abcdefgbdb", "bdf", "XYZ"));
console.info(translate("abcdefg", "cde", "dec"));
console.info(translateFixed("abcdefg", {c: 'd', d: 'e', e: 'c'}));
console.info(translateFixedNoRegEx("abcdefg", {c: 'd', d: 'e', e: 'c'}));

Если вы не против изменить сигнатуру метода, ее, конечно, можно было бы сделать немного более сжатой.

Обновлено: я добавил еще два метода, которые действительно достигают того, что вы ищете. Для справки я также оставил там оригинальный метод translate.

translateFixed использует регулярные выражения для сопоставления каждого символа и замены его, если он был указан в параметре replacements. translateFixedNoRegex просто создает массив символов из строки input и перебирает их. Если символ ch соответствует единице в параметре replacements, он заменяется, в противном случае он остается без изменений. После этого мы преобразуем его обратно в строку, объединив символы.

Вы спросили о [... array]: это оператор распространения, представленный в ES6. При использовании в строке он просто берет каждый символ и помещает его как отдельную запись в массив. Это означает, что обе эти строки эквивалентны:

console.info([..."mystring"]);
console.info("mystring".split(''));

Пожалуйста, скажите что-нибудь о "..." в "[... oldCharacters]". Я хотел бы знать об этом. Проблема с вашей функцией - «translate (« abcdefg »,« cde »,« dec »)» дает «abcccfg» вместо «abdecfg», чего я хотел бы. Я собираюсь посмотреть на это подробнее. Спасибо.

dcromley 08.05.2018 03:10

@dcromley Привет, я отредактировал свой ответ двумя новыми функциями и пояснением по [... array]

dani-sc 08.05.2018 12:03

@Bergi Я проверил свои распорядки и dani-sc, и НЕТ СОВМЕСТНИКОВ!

dcromley 09.05.2018 18:16

Другие вопросы по теме