Алгоритм лемматизации на javascript

Иногда возникает проблема при склонении слов в русском языке. Например, нам нужно в какой-нибудь CRM отобразить количество задач у пользователя. Вот так выглядит не очень: «Всего: 1 задач», «Всего: 5 задач», «Всего: 4 задач».  Звучит, мягко говоря не по-русски и режет слух и глаз. Без склонения на Javascript бывает сложно обойтись.

Проблема новичкам покажется очень сложной, но,  у склонения слов есть некоторая закономерность. Посмотрите сами: «1 задача, 2 задачи, 5 задач, 11 задач, 19 задач, 21 задача, 22 задачи, 25 задач и так далее». Видите закономерность? 1, 21, 31, 41 — всегда будет «задача». Если младший разряд больше 1-го и меньше 5, при этом само число при делении на 100 имеет остаток больше 20 (то есть, например, не число 12 и не 112), то будут «задачи». В остальных случаях «задач».

А вот дальше уже начинается построение алгоритма, поскольку закономерность очевидно имеется. Я приведу вам, на мой взгляд,  наиболее красивый и короткий алгоритм.

//Сама функция
function lemma( num, suffix ) {

	var keys = [2, 0, 1, 1, 1, 2],
	    mmod = num % 100,
	    suffixKey = ( mmod > 7 && mmod < 20 ) ? 2: keys[(mmod % 10 < 5 ? mmod % 10 : 5)];

	return suffix[suffixKey];
}

//Проверяем функцию на числах от 0 до 100
for(var i = 0, suff = ["задача", "задачи", "задач"]; i < 100 ; i++) {
	console.log("Всего: " + i + " " + lemma(i, suff));
}

 

2 комментариев

Оставить комментарий