@super84 said in Определить внешний ip - для чего, важно ли?:
Одобряю
Выполняю код в BAS с помощью "Выполнить код", а он в 90% случаев виснет на данном участке кода.
Код генерации логина. Логика кода:
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, что при достижение какого-то числа итерациий вырубало