Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблема с вызовом элемента массива в скрипте (https://javascript.ru/forum/misc/74096-problema-s-vyzovom-ehlementa-massiva-v-skripte.html)

dTM 13.06.2018 13:09

Проблема с вызовом элемента массива в скрипте
 
Суть проблемы следующая, есть скрипт (я знаю что сам скрипт кривой, запутанный и прочее, я новичок в изучении JS, и решал задачку сам как мог):

function NumPerString(numb) {
	let units = ['Один','Два','Три','Четыре','Пять','Шесть','Семь','Восемь','Девять','Десять', 'Одинадцать', 'Двенадцать', 'Тринадцать', 
				'Четырнадцать', 'Пятнадцать', 'Шестнадцать', 'Семьнадцать', 'Восемнадцать', 'Девятнадцать'],
		dozenOf = ['Двадцать', 'Тридцать', 'Сорок', 'Пятьдесят', 'Шестьдесят', 'Семдесят', 'Восемдесят', 'Девяносто'],
		hundreds = ['Сто', 'Двести', 'Триста', 'Четыреста', 'Пятьсот', 'Шестьсот', 'Семьсот', 'Восемьсот', 'Девятьсот'],
		thousands = ['Тысяча', 'Тысячи', 'Тысяч'],
		millions = ['Миллион', 'Милиона', 'Миллионов'],
		numerator = ['Одна', 'Две'];
	if (numb < 0 || numb > 999999999) {
		return 'Не коректное число!<br>';
	} else if (numb == '' || isNaN(numb) || numb == 0) {
		return 'Ноль';
	} else if (numb > 0 && numb < 20 ) {
		return units[numb-1];
	} else if (numb > 19 && numb < 100) {
		if (numb % 10 === 0) {
			return dozenOf[Math.floor((numb / 10) - 2)];
		} else if (numb % 10 != 0) {
			return dozenOf[Math.floor((numb / 10) - 2)] + ' ' + units[(numb%10) - 1];
		}
	} else if (numb > 99 && numb < 1000) {
		if (numb % 100 === 0) {
			return hundreds[Math.floor((numb / 100) - 1)];
		} else if (numb % 100 != 0) {
			if (numb%100 > 0 && numb%100 < 20 ) {
				return hundreds[Math.floor((numb / 100) - 1)] + ' ' + units[Math.floor(numb%100-1)];
			} else if (numb%100 > 19 && (numb%100)%10===0) {
				return hundreds[Math.floor((numb / 100) - 1)] + ' ' + dozenOf[Math.floor((numb%100)/10 - 2)];				
			} else if (numb%100 > 20 && (numb%100) % 10 != 0) {
				return hundreds[Math.floor((numb / 100) - 1)] + ' ' + dozenOf[Math.floor((numb%100)/10 - 2)] + ' ' + units[Math.floor(((numb%100)%10)-1)];
			}
		}
	} else if (numb === 1000) {
		return numerator[numb/1000-1]+ ' ' + thousands[numb/1000-1];		
	} else if (numb > 1000 && numb < 2000) {
		if (numb%1000 > 0 && numb%1000 < 20) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' +units[Math.floor(numb%1000-1)];
		} else if (numb%1000 > 19 && (numb%100)%10===0) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' +dozenOf[Math.floor((numb%1000)/10 - 2)];			
		} else if (numb%1000 > 99 && (numb%1000)%100===0) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' + hundreds[Math.floor(((numb%1000)/100)-1)];			
		} else if (numb%1000 > 20 && (numb%1000) % 10 != 0) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' + dozenOf[Math.floor((numb%1000)/10 - 2)] + ' ' + units[Math.floor(((numb%1000)%10)-1)];
		} else if ((numb%1000) > 100 && (numb%1000) < 120) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' +hundreds[Math.floor(numb%1000/100-1)]+ ' ' +units[Math.floor((numb%1000)%100-1)];
		}
	}
}
console.log(NumPerString(1100));


Проблема заключается в том, что в строках 41 и 45 вызов к элементу массива hundreds не работает, и выдает undefined. Сама формула, проверена в консоли и точно выдает 0, что должно по идеи выводить нулевой элемент массива. И даже при замене самой формулы, на hundreds[0], все равно выдает undefined.
Кто знает в чем именно ошибка, и как её исправить и избежать, подскажите пожалуйста новичку.

P.S. Большая просьба, с ответами типа скрипт плохой, ссылками или примерами более продвинутых скриптов, не писать, мне интересна именно в чем причина ошибки, и если можно человеческим языком, и как её решить, если она вообще решаема.

Заранее большое спасибо за ответы.

Nexus 13.06.2018 13:14

Выведите в консоль массив "hundreds" и ключ, после смотрите есть в массиве этот ключ или нет.

dTM 13.06.2018 13:18

Массив "hundreds" в выводе сотен вполне себе отвечает. И выводит нужный элемент, проблема именно с выводом элемента в тысячах и указаны строки.

Проверил:

function NumPerString(numb) {
	let hundreds = ['Сто', 'Двести', 'Триста', 'Четыреста', 'Пятьсот', 'Шестьсот', 'Семьсот', 'Восемьсот', 'Девятьсот'];
		
 return console.log(hundreds[numb%1000/100-1]);
}
console.log(NumPerString(1100));


Все работает из массива достает первый элемент, второй и т.д., но в самом скрипте нет.

Nexus 13.06.2018 13:39

dTM, так вы в самом скрипте и выводите данные в консоль...

dTM 13.06.2018 13:44

Цитата:

Сообщение от Nexus (Сообщение 487256)
dTM, так вы в самом скрипте и выводите данные в консоль...

Я проверял и без вывода консоли в скрипте, все работает, все находит, есть в hundreds элемент с ключом 0. Проблема в том, что оно не работает в самом скрипте, в определенном месте, и определенный массив, почему не понятно.

j0hnik 13.06.2018 13:52

dTM,
у вас в 39 строке которая и срабатывает при таком числе, сотни отсутствуют надо добавить что-то типа
hundreds[Math.floor((numb%1000)/100 - 1)]

j0hnik 13.06.2018 13:54

видимо условия неполные, скрипт заходит не в ту ветку, которую вам нужно

dTM 13.06.2018 14:01

Цитата:

Сообщение от j0hnik (Сообщение 487259)
dTM,
у вас в 39 строке которая и срабатывает при таком числе, сотни отсутствуют надо добавить что-то типа
hundreds[Math.floor((numb%1000)/100 - 1)]

Все я понял ошибку, Большое Спасибо!


Часовой пояс GMT +3, время: 08:48.