Есть ли мастера JavaScript'а? Виснет код.

Поддержка
  • Выполняю код в BAS с помощью "Выполнить код", а он в 90% случаев виснет на данном участке кода.

    Код генерации логина. Логика кода:

    1. Берется имя и фамилия (пример: Александра Попова). Меняется на нижний регистр (александра попова). Применяется транслитерация (aleksandra popova). - Переменные "englishFirstName" и "englishLastName"
    2. Генерируется случайная длина и случайный текст (Пример: nsfd). - Переменная "randomText"
    3. Генерируется случайная длина и случайные цифры (Пример: 324). - Переменная "randomNumber"
    4. Всё это склеивается в логин (Пример: aleksandrapopovansfd324). - Переменная "[[USER_LOGIN]]"
    var [[USER_LOGIN]]
    
    function englishStringConverter(string) { //Функция транслитерации (Из русских букв - в английские)
      string = string.toLowerCase()
      for (var i = 0; i < string.length; i++) {
        var englishChar = [[GENERATOR_ENGLISHCHARS]][string[i]] //GENERATOR_ENGLISHCHARS - объект вида {в: 'v', г: 'g'} со всеми буквами
        string = string.replace(string[i], englishChar)
      }
      return string
    }
    var englishFirstName = englishStringConverter([[USER_FIRSTNAME]]) //Имя английскими буквами
    var englishLastName = englishStringConverter([[USER_LASTNAME]]) //Фамилия английскими буквами
    
    var randomText = '' //Случайный текст
    var minTextLength = 3
    var maxTextLength = 4
    var randomTextLength = Math.floor(Math.random() * (maxTextLength - minTextLength + 1) + minTextLength)
    for (var i = 0; i < randomTextLength; i++) {
      randomText += [[GENERATOR_LOWERCASE]][Math.floor(Math.random() * [[GENERATOR_LOWERCASE]].length)]
    }
    
    var randomNumber = '' //Случайные числа
    var minNumberLength = 1
    var maxNumberLength = 2
    var randomNumberLength = Math.floor(Math.random() * (maxNumberLength - minNumberLength + 1) + minNumberLength)
    for (var i = 0; i < randomNumberLength; i++) {
      randomNumber += [[GENERATOR_NUMBERS]][Math.floor(Math.random() * [[GENERATOR_NUMBERS]].length)]
    }
    
    [[USER_LOGIN]] = englishFirstName + englishLastName + randomText + String(randomNumber) //Готовый логин
    

    Почему виснет не понимаю. Может метод replace затратный, может циклов много... Уже всю голову сломал.
    Генерирует отлично, но зависает еще лучше.

  • @SecDeveloper said in Есть ли мастера JavaScript'а? Виснет код.:

    var englishChar = [[GENERATOR_ENGLISHCHARS]][string[i]] //GENERATOR_ENGLISHCHARS - объект вида {в: 'v', г: 'g'} со всеми буквами
    string = string.replace(string[i], englishChar)

    Ошибка тут

        var englishChar = [[GENERATOR_ENGLISHCHARS]][string[i]] //GENERATOR_ENGLISHCHARS - объект вида {в: 'v', г: 'g'} со всеми буквами
        string = string.replace(string[i], englishChar)
    

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

    string[i] = 'a'
    

    Вообще это можно было легко найти, достаточно тестироровать код частями, и добавить логи

  • @UserTrue И правда! До конца не понял, почему замена с replace иногда не могла найти соответствующую букву, ибо весь алфавит в словаре указан и undefined появляться не должно, но уже и понимать не нужно.
    Превратил в массив, поменял буквы по индексу, превратил в строку. Теперь работает норм!

    function englishStringConverter(string) {
      string = string.toLowerCase().split('')
      for (var i = 0; i < string.length; i++) {
        var englishChar = VAR_GENERATOR_ENGLISHCHARS[string[i]]
        string[i] = englishChar
      }
      string = string.join('')
      return string
    }
    

    Спасибо.

  • @SecDeveloper дело не в replace, а в том, что если в словаре по указанному ключу не будет соответствия то вернётся undefined

  • @UserTrue Только сейчас понял: я заменял "ь" и "ъ" пустотой "". Потом длина строки уменьшалась, а цикл прежней длины и ищет, к примеру, индекс 9, когда в строке уже 8 индексов из-за стертого мягкого знака. Поэтому ищет по пустому ключу. И соответствия нет.
    А если я в массиве по индексам меняю, то порядок и длина массива никак не поменяется и всё успешно заменится.

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

    Вы мне очень помогли.

  • @SecDeveloper для отладки можно было в цикл добавить break, что при достижение какого-то числа итерациий вырубало