1
votes

Salut tout le monde, comment fonctionne cette instruction if de la fonction updateList?

Cet extrait de code fonctionne bien, mais je veux connaître la logique derrière l'instruction if dans la fonction updateList? Je sais pourquoi j'obtiens tous les pays lorsque la valeur de sélection est à tous, mais lorsque j'ai choisi une autre valeur dans une liste de sélection comme l'Océanie, je n'obtiens que les pays de cette région. Comment ce simple opérateur logique ou peut-il filtrer le reste des pays et renvoyer uniquement une région spécifique? J'apprécierais que quelqu'un puisse m'expliquer étape par étape comment fonctionne toute cette fonction updateList?

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <header>
        <h3>Where in the world?</h3>
        <i class="fas fa-moon">Dark Mode</i>
    </header>
    <nav>
        <!-- Search input -->
        <div class="search">
            <i class="fas fa-search"></i>
            <input type="text" placeholder="Search for a country" id="searchInput">
        </div>
    </nav>
    <main>
        <!-- Filter Countries -->
        <select name="Filter by Region" id="regionMenu">
            <option value="all">Filter by Region</option>
            <option value="Africa">Africa</option>
            <option value="Americas">Americas</option>
            <option value="Asia">Asia</option>
            <option value="Europe">Europe</option>
            <option value="Oceania">Oceania</option>
        </select>
        <div class="result">

        </div>
    </main>

    <script src="main.js"></script>
</body>

</html>
const regionMenu = document.querySelector('#regionMenu');
const result = document.querySelector('.result');
const countryUrl = 'https://restcountries.eu/rest/v2/all';
let countries;

fetch(countryUrl)
    .then(response => response.json())
    .then(json => {
        countries = json;
        // console.log(countries);
        updateList();
    })
    .catch(err => console.log(err));

function updateList() {
    let output = '';
    for(let i = 0; i < countries.length; i++) {
        if(regionMenu.value === 'all' || regionMenu.value === countries[i].region) {
          output += `
          <div>
            <img src=${countries[i].flag} width="160px" height="80px">
            <ul>
              <li> Name: ${countries[i].name}</li>
              <li> Population: ${countries[i].population}</li>
              <li> Region: ${countries[i].region}</li>
              <li> Capital: ${countries[i].capital}</li>
            </ul>
          </div>
        `;
        }
    }
    result.innerHTML = output;
}

regionMenu.addEventListener('change', updateList);


0 commentaires

4 Réponses :


3
votes

Vous êtes probablement induit en erreur par le fait que ce code n'utilise pas correctement map . Tout d'abord, répondez à votre question:

Comment ce simple opérateur ou logique peut filtrer le reste des pays et renvoyer uniquement une région spécifique?

Si la condition est fausse, le rappel map ne fait rien. Si la condition est vraie, elle s'ajoute à la variable output .

Alors, qu'en est-il de l'utilisation incorrecte de map ? Malheureusement, quelqu'un enseigne la map comme un itérateur général pour les tableaux. Ça ne l'est pas. map crée un nouveau tableau à partir des valeurs de retour qu'il obtient de son rappel. Si vous n'utilisez pas ce nouveau tableau, map est tout simplement le mauvais outil à utiliser - utilisez forEach ou for-of ou l'une des nombreuses autres façons de parcourir un tableau .

Mais comme ce code utilise map , vous pensiez probablement que map faisait autre chose que de simplement parcourir le tableau. Ce n'est pas le cas, il a simplement été mal utilisé.

Comme je l'ai dit, sur la base du code vu sur Stack Overflow au cours des 18 derniers mois environ, quelqu'un doit enseigner activement cette mauvaise utilisation de la carte , ce qui est malheureux.

Voici quelques exemples de façons de mettre à jour updateList -

Utilisation de forEach code >:

function updateList() {
    result.innerHTML = countries.filter(
        country => regionMenu.value === 'all' || regionMenu.value === country.region
    ).map(country => `
          <div>
            <img src=${country.flag} width="160px" height="80px">
            <ul>
              <li> Name: ${country.name}</li>
              <li> Population: ${country.population}</li>
              <li> Region: ${country.region}</li>
              <li> Capital: ${country.capital}</li>
            </ul>
          </div>
        `
    ).join("");
}

Utilisation de for-of:

function updateList() {
    result.innerHTML = countries.map(country => {
        if (regionMenu.value === 'all' || regionMenu.value === country.region) {
          return `
          <div>
            <img src=${country.flag} width="160px" height="80px">
            <ul>
              <li> Name: ${country.name}</li>
              <li> Population: ${country.population}</li>
              <li> Region: ${country.region}</li>
              <li> Capital: ${country.capital}</li>
            </ul>
          </div>
        `;
        }
        return "";
    }).join("");
}

Utilisation de map correctement en renvoyant toujours une valeur significative et en utilisant .join ("") sur le tableau résultant:

function updateList() {
    let output = '';
    for (const country of countries) {
        if (regionMenu.value === 'all' || regionMenu.value === country.region) {
          output += `
          <div>
            <img src=${country.flag} width="160px" height="80px">
            <ul>
              <li> Name: ${country.name}</li>
              <li> Population: ${country.population}</li>
              <li> Region: ${country.region}</li>
              <li> Capital: ${country.capital}</li>
            </ul>
          </div>
        `;
        }
    }
    result.innerHTML = output;
}

Utilisation du filtre , puis map , puis join:

function updateList() {
    let output = '';
    countries.forEach(country => {
        if (regionMenu.value === 'all' || regionMenu.value === country.region) {
          output += `
          <div>
            <img src=${country.flag} width="160px" height="80px">
            <ul>
              <li> Name: ${country.name}</li>
              <li> Population: ${country.population}</li>
              <li> Region: ${country.region}</li>
              <li> Capital: ${country.capital}</li>
            </ul>
          </div>
        `;
        }
    });
    result.innerHTML = output;
}


1 commentaires

Merci l'homme pour ces informations utiles, je suis relativement nouveau dans le javascript et il est parfois difficile d'attraper ces erreurs non visibles, je l'ai remplacé par une boucle for.



1
votes

Chaque fois que la fonction updateList () est appelée, elle crée une nouvelle variable sortie vide. Ensuite, avec la carte , il parcourt les objets pays. Pour chaque objet, il examine si la valeur de l'entrée select est all, ou si la valeur de l'option sélectionnée est la même que la région de l'élément actuel.

Si all est sélectionné, la condition if est évaluée comme vraie pour tous les éléments, ajoutant ainsi chacun à la variable de sortie.

Si ce n'est pas tout, mais que la valeur sélectionnée est équivalente à la région de l'objet courant, alors l'objet courant est une correspondance et le div avec les clés nécessaires de l'objet est ajouté à la variable de sortie.

À la fin, cette variable de sortie est ajoutée au résultat div .


1 commentaires

Merci mec, belle élaboration de pseudo-code de cette fonction de mise à jour.



1
votes

Image la structure des pays est un tableau avec l'objet uniquement avec region et nom .

Par exemple, j'ai ce tableau:

australia: south america === oceania (False)
fiji: south america === oceania (False)
Samoa: south america === oceania (False)
peru: south america === south america (True)
brazil: south america === south america (True)
argentina: south america === south america (True)

Res: [peru, brazil, argentina].

Vous allez maintenant mapper tous les tableaux chacun par chaque élément avec l'instruction if qui a dit:

  1. Si regionMenu.value est tout, j'imprimerai le pays actuel
  2. Si regionMenu.value est le même que contry.region, j'imprimerai le pays actuel

L'opérateur ou || a dit qu'une seule partie sera vraie à passer.

Si vous sélectionnez le regionMenu.value comme "all" , tous les pays seront passés dans la première section du conditionnel (1).

Sinon, si vous sélectionnez une autre valeur comme "oceania" la première partie sera toujours fausse oceania === all => False (1). Le filtre dépendra donc de la deuxième partie (2):

australia: oceania === oceania (True)
fiji: oceania === oceania (True)
Samoa: oceania === oceania (True)
peru: oceania === south america (False)
brazil: oceania === south america (False)
argentina: oceania === south america (False)

Res: [australia, fiji, Samoa].

Comme autre exemple, si la valeur de regionMenu.value est "amérique du sud" les résultats seront:

const countries = [
    {region: "oceania", name: "australia"},
    {region: "oceania", name: "fiji"},
    {region: "oceania", name: "Samoa"},
    {region: "south america", name: "peru"},
    {region: "south america", name: "brazil"},
    {region: "south america", name: "argentina"},
];


0 commentaires

1
votes

Encore une fois, merci à tous d'avoir pris votre temps et de m'avoir fourni d'excellentes informations. Habituellement, ce monde de la programmation peut être très négatif, mais je suis heureux d'avoir rejoint cette grande communauté. Passez une bonne journée à tous!


0 commentaires