Да, я хочу, чтобы в 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 Спасибо, мои поиски не попали в "функцию Perl tr". Там много всего.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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", чего я хотел бы. Я собираюсь посмотреть на это подробнее. Спасибо.
Это не работает, если буквы в xlatfrom и xlatto совпадают.
@Bergi Полные спецификации для этой функции не упоминаются. Итак, у меня остался один вариант: зацикливаться на коде php translate () и конвертировать его в javascript. У меня не так много времени :)
Что ж, если хотите, вы можете использовать такие регулярные выражения:
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 Привет, я отредактировал свой ответ двумя новыми функциями и пояснением по [... array]
@Bergi Я проверил свои распорядки и dani-sc, и НЕТ СОВМЕСТНИКОВ!
Что-то вроде ответов в этот вопрос может быть тем, что вы ищете