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 };
3 Réponses :
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)
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é!
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);
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é.
Un moyen beaucoup plus simple de résoudre ce problème serait d'utiliser un filtre