1
votes

Comment faire une boucle dans un tableau et extraire uniquement clé: valeur qui sont des valeurs spécifiques?

Je voudrais parcourir un objet existant et extraire uniquement des clés spécifiques à ajouter à un nouveau tableau.

L'objet ressemble à:

function findHasLyrics(lyricsData) {
    if (lyricsData.length === 0) {
        displayLyricsApi(null);
    } else {
        function findHasLyrics(lyricsData) {
            return lyricsData.result.filter(f => f.haslyrics)
    };
        formatQueryLyrics(findHasLyrics(lyricsData));
    };
}

Je voudrais seulement aime extraire les résultats si "haslyrics" est vrai .

Voici le bloc de code que j'ai trouvé:

1  function findHasLyrics(lyricsData) {
2      if (lyricsData.length === 0) {
3          console.log("findHasLyrics", null);
4      } else {
5          let hasLyricsTrue = [];
6          for (let i=0; i<lyricsData.length; i++) {
7              if (lyricsData.result[i].haslyrics === true) {
8                  hasLyricsTrue.push(lyricsData.result[i]);
9              };
10             console.log("findHasLyrics", hasLyricsTrue);
11         };
12     };
13 };


1 commentaires

Un moyen beaucoup plus simple de résoudre ce problème serait d'utiliser un filtre


3 Réponses :


1
votes

Utilisez simplement la méthode filter :

var data = {
    "success": true,
    "length": 50,
    "result": [{
        "id_track": 123,
        "haslyrics": true,
        "id_artrist": 234,
      },
      {
        "id_track": 567,
        "haslyrics": false,
        "id_artrist": 678,
      }
    ]
  };

 function findHasLyrics(lyricsData) {
    return lyricsData.result.filter(f=> f.haslyrics)
};

console.log(findHasLyrics(data));

dans votre cas:

function findHasLyrics(lyricsData) {
    return return lyricsData.result.filter(f=> f.haslyrics);
};

Un exemple: p>

lyricsData.result.filter(f=> f.haslyrics)


2 commentaires

Hey @StepUp, où la méthode de filtrage serait-elle appliquée? Merci.


J'avais besoin d'inclure les déclarations if else. Les lyricsData sont dynamiques et parfois, on me donne une longueur de 0. Dans le scénario, la longueur est de 0, je dois enregistrer un null. function findHasLyrics (lyricsData) {if (lyricsData.length === 0) {console.log ("findHasLyrics", null); } else {function findHasLyrics (lyricsData) {retour lyricsData.result.filter (f => f.haslyrics)}; console.log (findHasLyrics (lyricsData)); }; } C'était ma dernière ligne de code. Et ça a marché!



1
votes

Utilisez simplement Array.filter () pour filtrer le tableau avec les objets dont la valeur haslyrics est true . Vous pouvez éviter les boucles et la logique personnalisées avec cette fonction.

function findHasLyrics(lyricsData) {
  if (lyricsData.length === 0) {
    console.log("findHasLyrics", null);
  } else {
    var res = lyricsData.result.filter(({haslyrics}) => haslyrics);
    console.log(res);
  };
};


var obj = {
  "success": true,
  "length": 50,
  "result": [{
      "id_track": 123,
      "haslyrics": true,
      "id_artrist": 234,
    },
    {
      "id_track": 567,
      "haslyrics": false,
      "id_artrist": 678,
    }
  ]
};

findHasLyrics(obj);

Dans votre code, vous pouvez mettre à jour de cette manière:

var obj = {
   "success": true,
   "length": 50,
   "result": [
       {
         "id_track": 123,
         "haslyrics": true,
         "id_artrist": 234,
       },
       {
         "id_track": 567,
         "haslyrics": false,
         "id_artrist": 678,
    }
  ]
};

var res = obj.result.filter(({haslyrics}) => haslyrics);
console.log(res);


0 commentaires

1
votes

Le problème est que vous vous êtes facilement trompé dans la signature for , docs ici .

Le deuxième argument que vous utilisez ne renvoie pas un entier (nombre), lyricsData.result est un tableau, vous voulez renvoyer son .length , c'est-à-dire:

for (let i=0; i<lyricsData.result.length; i++) {
  ...
}

Cependant, je vous conseillerais d'utiliser .filter comme d'autres l'ont déjà suggéré.


0 commentaires