Pomoc z zadaniem (wywołanie stringa, który musi być jednym z trzech podanych)

0

Hej, dostałem takie zadanie z javascript:

Przygotuj funkcję, która przyjmuje nazwę miejscowości, temperaturę i aktualną pogodę, będącą w jednym z trzech stanów ["słonecznie", "pochmurno", "deszczowo"] w parametrach. Funkcja ma zwracać tekst z wpisaną pogodą, temperaturą i lokalizacją.

Usiłowałem to zrobić tak:

function pogoda(nazwaMiejscowości, temperatura, pogodaTeraz)
            {
                if (pogodaTeraz !== "pochmurno" || "słonecznie" || "deszczowo")
                console.error;

                let tekst = `Informacje o pogodzie z ostatniej chwili. W miejscowości ${nazwaMiejscowości} jest ${pogodaTeraz}.
                Temperatura wynosi ${temperatura} C.`;

                   return tekst;
            }

            console.log(pogoda("Gdańsk", 12, "nieDziała"));

Ale oczywiście nie działa.
Czy mogę prosić o pomoc?
(P.S. Sry za głupie pytania, cały czas wszystko mi się miesza :p )

1

Napisz konkretnie, co nie działa.

Opisz, w jaki sposób korzystasz z tej funkcji, co dostajesz, a na co liczyłeś - bo "oczywiście nie działa" to trochę mało konkretny opis problemu :p

2

Ja wiem co nie działa. Warunek w ifie jest źle zrobiony. Najpierw sprawdzasz czy pogodaTeraz jest różna od. A potem dajesz OR na wyrażenie bez porównania. Podaje przykład z zycoa
(Kup mleko) lub (ogórki) lub (śmietana). Tylko pierwsza instrukcja ma sens, żeby było poprawnie trzeba dać (kup mleko)lub(kup ogórki)lub (kup śmietana). Rozumiesz już?

1

if (pogodaTeraz !== "pochmurno" || "słonecznie" || "deszczowo")

To na pewno nie tak się pisze.
Otwórz jakiś tutorial / ksiazkę i znajdź jak to zapisać

1
pogodaTeraz !== "pochmurno" || "słonecznie" || "deszczowo"

Zdajesz sobie sprawę, że || dzieli to na trzy wyrażenia? O ile pierwsze jest ok, bo to zwykłe porównanie to dwa kolejne to same stringi. A stringi ewaluują do true, więc to wyrażenie będzie zawsze true. Zmień na trzy porównania albo ["słonecznie", "pochmurno", "deszczowo"].includes(pogodaTeraz)

0

Ok, zmieniłem na:

 if ((pogodaTeraz !== "pochmurno") || (pogodaTeraz  !== "słonecznie") || (pogodaTeraz !== "deszczowo"))
              { console.error;}

Ale w zasadzie działa tak, jak działało: ogólnie rzecz biorąc konsola zwraca mi tekst z funkcji niezależnie od tego, czy string jest równy czy różny w argumencie pogodaTeraz.
A chciałbym, żeby w przypadku, gdy string przesłany do argumentu pogodaTeraz jest różny, to żeby wyrzucało błąd, albo jakiś komunikat, żeby to poprawić.
Sry, dopiero zaczynam :/.

1

wiec przesledzmy tego ifa. Wrzucam do jako input "deszczowo"

sprawdzamy pierwszy warunek
pogodaTeraz jest rozna od "pochmurno" (bo zawiera deszczowo) wiec warunek jest spelniony i wyswietlamy error

a Ty chcesz zrobic na zasadzie
"jezeli input jest rozny od pochmurno i/oraz jest rozny od slonecznie i/oraz jest rozny od deszczowo wyswietl error"

0

Okej, ostatecznie zrobiłem to tak:

 function pogoda(nazwaMiejscowości, temperatura, pogodaTeraz)
            {

                let tekst = `Informacje o pogodzie z ostatniej chwili. W miejscowości ${nazwaMiejscowości} jest ${pogodaTeraz}.
                Temperatura wynosi ${temperatura} C.`;

                if 
                (pogodaTeraz === "pochmurno")
                    {return tekst;}
                        else if
                        (pogodaTeraz === "słonecznie")
                            {return tekst;}
                                else if
                                (pogodaTeraz === "deszczowo")
                                {return tekst;}
                                    else
                                    {return "nieprawidłowe dane"}      
            }

            console.log(pogoda("Gdańsk", 12, "pochmurno"));

I działa. Moje ostatnie pytanie - jak wtedy zrobić, żeby zamiast ,,nieprawidłowe dane" wyświetlało po prostu error. :)
Dziękuję za wszystkie podpowiedzi - dopiero się uczę :).

1

@TotalNewbie: Pomyśl jak by wyglądał ten 'if' gdybyś opcji miał z 10, według mnie lepiej zrobić tak:

function pogoda(nazwaMiejscowości, temperatura, pogodaTeraz)
{
    const allowedWeather = ["pochmurno", "słonecznie", "deszczowo"]

    let tekst = `Informacje o pogodzie z ostatniej chwili. W miejscowości ${nazwaMiejscowości} jest ${pogodaTeraz}.
    Temperatura wynosi ${temperatura} C.`;

    if(allowedWeather.includes(pogodaTeraz))
        return tekst;    
}
0

https://jsfiddle.net/80bnjq4k/

function pogoda(nazwaMiejscowości, temperatura, pogodaTeraz)
{
    const allowedWeather = ["pochmurno", "słonecznie", "deszczowo"];

    let tekst = `Informacje o pogodzie z ostatniej chwili. W miejscowości ${nazwaMiejscowości} jest ${pogodaTeraz}.
    Temperatura wynosi ${temperatura} C.`;

        return allowedWeather.some(x => x === pogodaTeraz)?tekst:"nieprawidłowe dane";    
}
console.log(pogoda("Łódź","20","pochmurno"))
console.log(pogoda("Kielce","-20","pizga"))
0

@Eldorad O.: @gk1982 - czemu nie stosujecie fail fast?

1

a w ogóle to nikt w poleceniu nie prosił o walidację wejścia. masz powiedziane że wejście jest w jednym z trzech stanów więc nie masz podstaw żeby w to wątpić
wystarczy

 function pogoda(nazwaMiejscowości, temperatura, pogodaTeraz)
            {
                return `Informacje o pogodzie z ostatniej chwili. W miejscowości ${nazwaMiejscowości} jest ${pogodaTeraz}.
                Temperatura wynosi ${temperatura} C.`;
            }

poza tym console.error; nic nie robi - to funkcja której nie wywołujesz

to co robisz nazywa się programowaniem defensywnym. Jeśli dane pochodzą od usera to powinny być walidowane na wcześniejszym etapie, jeśli pochodzą z kodu to kod w zasadzie nigdy nie powinien dopuścić takiej sytuacji, jeśli do niej doszło to błąd jest w całkowicie innym miejscu i jest ukrywany - w obu przypadkach check w tym miejscu jest zbędny

1 użytkowników online, w tym zalogowanych: 0, gości: 1