w ostatnim projekcie potrzebowałem kodu, który odmieniałby słowa przez przypadki według liczby, czyli np.
- Mam 12 psów.
- Bajka o 71 krasnoludkach.
- Nie piłem od 100 lat.
Tworzenie tej funkcji było dobrą zabawą i wymagało analizy jak zmieniają się przypadki w zależności od kontekstu. Odkryłem, że mianownik, biernik i wołacz przy niektórych liczbach zmieniają się w dopełniacz. Pozostałe przypadki nie zmieniają się wcale.
A oto owoc mojej rozkminy:
function getWordForm(wordObject, context, number) { var toGenitive = ["nominative", "accusative", "vocative"], absolute = Math.abs(number), validForm = ""; if (toGenitive.indexOf(context) > -1 && absolute !== 1 && (absolute % 10 <= 1 || absolute % 10 >= 5 || (absolute % 100 >= 11 && absolute % 100 <= 19))) { validForm = wordObject.plural.genitive; } else { validForm = wordObject[absolute === 1 ? "singular" : "plural"][context]; } return validForm; }
I przykład użycia:
var dog = { singular: { nominative: "pies", genitive: "psa", dative: "psu", accusative: "psa", instrumental: "psem", locative: "psie", vocative: "psie" }, plural: { nominative: "psy", genitive: "psów", dative: "psom", accusative: "psy", instrumental: "psami", locative: "psach", vocative: "psy" } }; console.log("Mam 4 " + getWordForm(dog, "accusative", 4)); console.log("Piszę książkę o 30 " + getWordForm(dog, "locative", 30)); console.log("Idę na spacer z moim " + getWordForm(dog, "instrumental", 1)); console.log("Nie zniosę 101 " + getWordForm(dog, "genitive", 101) + " w moim domu!");
Obiekt słowa zawiera wszystkie przypadki, więc można się dowolnie bawić kontekstem i liczbą. Można też wzbogacić funkcję o opcję automatycznego wyświetlania liczby przed słowem, żeby się nie powtarzać.
Podoba Wam się?
