Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.01.2020, 08:11
Новичок на форуме
Отправить личное сообщение для Oberin98 Посмотреть профиль Найти все сообщения от Oberin98
 
Регистрация: 03.01.2020
Сообщений: 1

Проверка на toUpperCase()
Работаю на создание транслита, изначально реализовал функцию что все символы приводит в нижний регист и потом происходит транслит и все было хорошо.
Сейчас пытаюсь реализовать что бы зашлавные буквы оставались заглавными не внося дополнительные ключи в объект alphabet, но на проверке toUpperCase всегда выдает ошибку элемент не найден, не могу понять почему, помогите пожалуйста

Описание:

Объект alphabet - это алфаит русский - транслит на англ

Массив alphabetKeys - массив ключей alphabet т.е. русски алфавит, необходим для проверки в функции

В функции изначально полученную строку разбиваю на элементы, первое услови пропускает все пробелы что бы второе условие (проверка на toUpperCase и транслит в верхнем регистре) не задевало пробелы и не давало ошибку, третье условие транслитирует сиволы нижнего регистра

const alphabet = {
  а : 'a', б : 'b', в : 'v', г : 'g', д : 'd', е : 'e', ё : 'e', ж : 'zh',
  з : 'z', и : 'i', й : 'i', к : 'k', л : 'l', м : 'm', н : 'n', о : 'o',
  п : 'p', р : 'r', с : 's', т : 't', у : 'u', ф : 'f', х: 'h', ц : 'c',
  ч :'ch', ш : 'sh', щ : 'sh', ъ : '', ы : 'i', ь : '\'', э : 'e', ю : 'y', 
  я : 'ia'
};


const alphabetKeys = Object.keys(alphabet);


let a = 'Привет красавчик';


function trans(x){
  let arr = x.split('');
  console.log(arr)
  for(let i = 0; i < arr.length-1; i+=1){
    if(arr[i] == ' '){
      i++;
    } else if(alphabetKeys.filter(n => n.toUpperCase() == arr[i])){
      arr[i] = alphabet[arr[i]].toUpperCase();
    } else if(alphabetKeys.filter(n => n == arr[i])){
      arr[i] = alphabet[arr[i]];
    }
  }
  return arr.join('')
};
Ответить с цитированием
  #2 (permalink)  
Старый 03.01.2020, 08:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

транслит с сохранением регистра
Oberin98,
<script>
const alphabet = {
  а : 'a', б : 'b', в : 'v', г : 'g', д : 'd', е : 'e', ё : 'e', ж : 'zh',
  з : 'z', и : 'i', й : 'i', к : 'k', л : 'l', м : 'm', н : 'n', о : 'o',
  п : 'p', р : 'r', с : 's', т : 't', у : 'u', ф : 'f', х: 'h', ц : 'c',
  ч :'ch', ш : 'sh', щ : 'sh', ъ : '', ы : 'i', ь : '\'', э : 'e', ю : 'y',
  я : 'ia'
};
let a = 'Привет красавчик';
function trans(str){
 return [...str].map(a => a.toLowerCase() in alphabet ? a.toLowerCase() == a ? alphabet[a] : alphabet[a.toLowerCase()].toUpperCase() : a).join('')
};
document.write(trans(a))
  </script>

Последний раз редактировалось рони, 03.01.2020 в 08:54.
Ответить с цитированием
  #3 (permalink)  
Старый 03.01.2020, 08:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Сообщение от Oberin98
не могу понять почему,
Сообщение от Oberin98
filter
возвращает массив!!! проверяйте длину этого массива, а лучше замените на find.
Ответить с цитированием
  #4 (permalink)  
Старый 03.01.2020, 08:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Oberin98,
<script>
const alphabet = {
  а : 'a', б : 'b', в : 'v', г : 'g', д : 'd', е : 'e', ё : 'e', ж : 'zh',
  з : 'z', и : 'i', й : 'i', к : 'k', л : 'l', м : 'm', н : 'n', о : 'o',
  п : 'p', р : 'r', с : 's', т : 't', у : 'u', ф : 'f', х: 'h', ц : 'c',
  ч :'ch', ш : 'sh', щ : 'sh', ъ : '', ы : 'i', ь : '\'', э : 'e', ю : 'y',
  я : 'ia'
};


const alphabetKeys = Object.keys(alphabet);


let a = 'Привет красавчик';


function trans(x){
  let arr = x.split('');
  console.log(arr)
  for(let i = 0; i < arr.length; i++){
    if(arr[i] == ' '){
       continue;
    } else if(alphabetKeys.filter(n => n.toUpperCase() == arr[i]).length){
      arr[i] = alphabet[arr[i].toLowerCase()].toUpperCase();
    } else if(alphabetKeys.filter(n => n == arr[i]).length){
      arr[i] = alphabet[arr[i]];
    }
  }
  return arr.join('')
};

document.write(trans(a))
  </script>


<script>
const alphabet = {
  а : 'a', б : 'b', в : 'v', г : 'g', д : 'd', е : 'e', ё : 'e', ж : 'zh',
  з : 'z', и : 'i', й : 'i', к : 'k', л : 'l', м : 'm', н : 'n', о : 'o',
  п : 'p', р : 'r', с : 's', т : 't', у : 'u', ф : 'f', х: 'h', ц : 'c',
  ч :'ch', ш : 'sh', щ : 'sh', ъ : '', ы : 'i', ь : '\'', э : 'e', ю : 'y',
  я : 'ia'
};


const alphabetKeys = Object.keys(alphabet);


let a = 'Привет красавчик';


function trans(x){
  let arr = x.split('');
  console.log(arr)
  for(let i = 0; i < arr.length; i++){
    if(arr[i] == ' '){
       continue;
    } else if(alphabetKeys.find(n => n.toUpperCase() == arr[i])){
      arr[i] = alphabet[arr[i].toLowerCase()].toUpperCase();
    } else if(alphabetKeys.find(n => n == arr[i])){
      arr[i] = alphabet[arr[i]];
    }
  }
  return arr.join('')
};

document.write(trans(a))
  </script>


<script>
const alphabet = {
  а : 'a', б : 'b', в : 'v', г : 'g', д : 'd', е : 'e', ё : 'e', ж : 'zh',
  з : 'z', и : 'i', й : 'i', к : 'k', л : 'l', м : 'm', н : 'n', о : 'o',
  п : 'p', р : 'r', с : 's', т : 't', у : 'u', ф : 'f', х: 'h', ц : 'c',
  ч :'ch', ш : 'sh', щ : 'sh', ъ : '', ы : 'i', ь : '\'', э : 'e', ю : 'y',
  я : 'ia'
};
let a = 'Привет красавчик';

function trans(str){
  let temp = '';
  for(let a of str) {
     let b = a.toLowerCase();
     const LowerCase = a == b;
     b = alphabet[b];
     if(b !== void 0) a = LowerCase ? b : b.toUpperCase();
     temp += a;
  }
  return temp
}


document.write(trans(a))
  </script>

Последний раз редактировалось рони, 03.01.2020 в 08:53.
Ответить с цитированием
  #5 (permalink)  
Старый 03.01.2020, 14:49
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

Filter, find... у тебя изначально объект, в котором выбор по ключу максимально быстрый, а ты его зачем-то преобразуешь в массив и на каждую букву полностью перебираешь.

Изначально должно было быть примерно так, тогда бы никаких проблем бы не возникло:
{
const alphabet = {
  а : 'a', б : 'b', в : 'v', г : 'g', д : 'd', е : 'e', ё : 'e', ж : 'zh',
  з : 'z', и : 'i', й : 'i', к : 'k', л : 'l', м : 'm', н : 'n', о : 'o',
  п : 'p', р : 'r', с : 's', т : 't', у : 'u', ф : 'f', х: 'h', ц : 'c',
  ч :'ch', ш : 'sh', щ : 'sh', ъ : '', ы : 'i', ь : '\'', э : 'e', ю : 'y', 
  я : 'ia'
};


let a = 'Привет красавчик';


function trans(x){
  let arr = x.split('');
  console.log(arr)
  for(let i = 0; i < arr.length-1; i+=1){
    if(arr[i] == ' '){
      i++;
    } else if(arr[i] in alphabet){
      arr[i] = alphabet[arr[i]];
    } else if(arr[i].toLowerCase() in alphabet){
      arr[i] = alphabet[arr[i].toLowerCase()].toUpperCase();
    }
  }
  return arr.join('')
};
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 04.01.2020, 04:48
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Лучше продублировать карту для заглавных букв, чтобы потом с этим не возиться.


<script>
const alphabet = {
  а : 'a', б : 'b', в : 'v', г : 'g', д : 'd', е : 'e', ё : 'e', ж : 'zh',
  з : 'z', и : 'i', й : 'i', к : 'k', л : 'l', м : 'm', н : 'n', о : 'o',
  п : 'p', р : 'r', с : 's', т : 't', у : 'u', ф : 'f', х: 'h', ц : 'c',
  ч :'ch', ш : 'sh', щ : 'shch', ъ : '', ы : 'i', ь : '\'', э : 'e', ю : 'y',
  я : 'ia'
};
Object.keys(alphabet).forEach((key)=>{
  alphabet[key.toUpperCase()] = alphabet[key].replace(/^./, m=>m.toUpperCase());
});


let a = 'Щегол ЩЕГОЛ';

function trans(str){
 let a = str.split('');
 for(let i=0; i<a.length; ++i) { a[i] = alphabet[a[i]] || a[i]; }
 return a.join('');
};

document.write(trans(a));
  </script>


Для тех букв, у которых транслитерация многобуквенная ("ч" и т.д.), заглавный вариант в примере предполагает написание слов с большой буквы, но не капсом полностью. Если надо нормально поддерживать капсовые слова, то придётся это отдельно проверять как-то.
Ответить с цитированием
  #7 (permalink)  
Старый 04.01.2020, 05:27
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

Alexandroppolus, не надо так делать:
alphabet[a[i]] || a[i]
твёрдый знак потеряешь.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 04.01.2020, 21:18
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Aetae,

Скорее не потеряю, а лишний раз "найду")

Да, новый оператор ?? зашёл бы здесь в самый раз...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка на существование элемента в реальном времени js dkmrus Общие вопросы Javascript 7 03.05.2016 22:12
проверка формы не работает в ie begelme Javascript под браузер 6 13.08.2013 01:00
Проверка встроенной поддержки типа с помощью библиотеки Modernizr viy.li Библиотеки/Тулкиты/Фреймворки 3 15.06.2013 15:48
Проверка данных формы составным условием? myafa Элементы интерфейса 8 01.04.2011 08:30
Проверка полей отправляемой формы. denisOgr jQuery 6 18.10.2010 19:40