Autor Zpráva
Michal_Luk
Profil
Ahoj. Stále jsem začátečník a řeším možná jednoduchou věc.
Uvedu na příkladu u telefonních čísel.
Mám číslo +420774000000, kde je mezinárodní předvolba +420 a chci aby se dosadilo, že se jedná o Českou republiku.
Pak mám číslo např. +490000000 kde je předvolba +49 a chci, aby se dosadilo Německo.
Vše jen pomocí JS. Představuju si to asi tak, že budu mít pole které bude k předvolbě definovat název země. Každá ta předvolba je jinak dlouhá (1,2 nebo 3 čísla), řídit se podle prvních dvou nejde, 420 a 421 by to bralo stejně.
Zkoušel jsem ale neuspěl jsem.
Výsledek by měl být např. +490000000 (Německo), +42151511215 (Slovensko)......
Dokáže mi někdo poradit jak na to?
Moc díky.


Zatím "řeším" tímto nešikovným a neúsporným způsobem
if (cislo.slice(0, 3) == 420) { zeme = "Česko"; } else if (cislo.slice(0, 3) == 421) { zeme = "Slovensko"; } else if (cislo.slice(0, 2) == 49) { zeme = "Německo"; }
_es
Profil
Michal_Luk:
Každá ta předvolba je jinak dlouhá (1,2 nebo 3 čísla)
Môžu byť aj 4 číslice a jeden štát môže mať aj viac predvolieb - napríklad Portoriko či Dominikánska republika. Alebo viac štátov môže mať spoločnú predvoľbu - napríklad USA a Kanada.
.
Keeehi
Profil
Seznam států a jejich předvoleb jsem našel zde github.com/OpenBookPrices/country-data/blob/master/data/countries.json
No a co se následného zjišťování týče, tak by mělo stačit postupně brát jednu předvolbu za druhou a tastovat, zda je na začátku. Bude to fungovat za předpokladu že předvolby tvoří prefixový kód. Pokud to tak není, muselo by se testovat od nejdelších předvoleb po nejkratší.
Výhoda tohoto postupu je, že je jednoduchý. Nevýhodou je, že je to pomalé.* Pokud by jsi chtěl asi to nejlepší možné řešení, vytvořil by jsi z tohoto obyčejného seznamu prefixový strom. Na hranách by byly číslice předvoleb, v listech země. Stačí pak podle čísla jít postupně tím stromem a až nenajdeš cestu dál, tak se podívat do uzlu, co je v něm za stát. Pokud na té stránce nebude milion čísel, pro které by se měla zjišťovat země, tak pak je to nejspíše zbyečné.

* Čistě teoreticky je složitost lineární. Ovšem jelikož předvoleb je jen pár (není jich více než tisíc) tak jejich projití není žádný problém.
Michal_Luk
Profil
Tak to vypadá že řešení které jsem zvolil není uplně nejhorší...
     if (cislo.slice(0, 3) == 420)     {zeme = "EU Česko";}
    else if (cislo.slice(0, 4) == 1345) {zeme = "Kajmanské ostrovy";}
    else if (cislo.slice(0, 3) == 979)     {zeme = "Izrael";}
    else if (cislo.slice(0, 3) == 977)     {zeme = "Nepál";}
    else if (cislo.slice(0, 3) == 971)     {zeme = "Spojené arabské emiráty";}
    else if (cislo.slice(0, 3) == 850)     {zeme = "Severní Korea";}
    else if (cislo.slice(0, 3) == 880)     {zeme = "Bangladéš";}
    else if (cislo.slice(0, 3) == 421)     {zeme = "EU Slovensko";}
    else if (cislo.slice(0, 3) == 386)     {zeme = "EU Slovinsko";}
    else if (cislo.slice(0, 3) == 385)     {zeme = "EU Chorvatsko";}
    else if (cislo.slice(0, 3) == 852)     {zeme = "Hongkong";}
    else if (cislo.slice(0, 3) == 376)     {zeme = "Andorra";}
    else if (cislo.slice(0, 3) == 374)     {zeme = "Arménie";}
    else if (cislo.slice(0, 3) == 372)     {zeme = "EU Estonsko";}
    else if (cislo.slice(0, 3) == 371)     {zeme = "EU Lotyšsko";}
    .
    .
    .
    else if (cislo.slice(0, 1) == 1)     {zeme = "USA, Kanada";}
    
Také to mám seřazeno od nejdelších předvoleb ...
Ve výsledku je to docela rychlé...
Jinak díky za ten link, zkusím ho nějak využít.
Keeehi
Profil
Ale fuj, co to je za prasárnu. Měl bys to mít v nějakém poli nebo objektu.

function getCountryFromPhone (phone) {
    var codes = {
        420:  "EU Česko",
        1345 "Kajmanské ostrovy",
        979:  "Izrael",
        977:  "Nepál",
        ...
    };
    
    for (var i = 4 ; i > 0 ; i--) {
        phone = phone.slice(0, i);
        if (codes[phone]) {
            return codes[phone];
        }
    }
    return "";
}
Michal_Luk
Profil
Keeehi:
To je ono :) ...
Moc díky, vyzkouším, tohle vypadá mnohem elegantněji.
Michal_Luk
Profil
Tak ještě jednou díky, přesně tohle jsem hledal, už vím kde jsem dělal chybu, mnohem MNOHEM lepší řešení.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: