J'essaye de trier cet objet JavaScript afin que seules certaines lignes soient renvoyées, l'objet:
const strongHeroes = [ { name: "Batman", powers: ["Strength", "Intelligence"] }, { name: "Superman", powers: ["Strength", "Flying"] }, { name: "Captain America", powers: ["Strength", "Shield"] }, ];
Je veux renvoyer uniquement les lignes qui ont le pouvoir "Force" dans les puissances section, mais pour renvoyer la ligne complète avec toutes les données, je voudrais donc l'avoir une fois terminé:
const baseHeroes = [ { name: "Batman", powers: ["Strength", "Intelligence"] }, { name: "Superman", powers: ["Strength", "Flying"] }, { name: "Spiderman", powers: ["Spider Sense", "Webs"] }, { name: "The Flash", powers: ["Speed"] }, { name: "Captain America", powers: ["Strength", "Shield"] }, ];
Toute aide serait grandement appréciée.
3 Réponses :
Array.filter
est votre ami ici. Parallèlement à cela, .includes
est également votre ami:
const baseHeroes = [ { name: "Batman", powers: ["Strength", "Intelligence"] }, { name: "Superman", powers: ["Strength", "Flying"] }, { name: "Spiderman", powers: ["Spider Sense", "Webs"] }, { name: "The Flash", powers: ["Speed"] }, { name: "Captain America", powers: ["Strength", "Shield"] }, ]; const results = baseHeroes.filter( h => h.powers.includes('Strength') ); console.log(results);
Il y a d'autres choses auxquelles vous voudrez peut-être penser, comme le respect de la casse et la possibilité que .powers
soit nul ou autre chose qu'un tableau, mais cela devrait vous donner idée de la façon de procéder.
Je suis extrêmement novice en JavaScript, mais ce qui suit semble fonctionner.
const strongHeroes = []; const baseHeroes = [ { name: "Batman", powers: ["Strength", "Intelligence"] }, { name: "Superman", powers: ["Strength", "Flying"] }, { name: "Spiderman", powers: ["Spider Sense", "Webs"] }, { name: "The Flash", powers: ["Speed"] }, { name: "Captain America", powers: ["Strength", "Shield"] }, ]; for (var i = 0; i < baseHeroes.length; i++) { if (baseHeroes[i].powers.indexOf("Strength") != -1) { strongHeroes.push(baseHeroes[i]); } }
Fondamentalement, il recherche dans le tableau d'origine, et si les pouvoirs contiennent la chaîne "Strength", il renvoie le emplacement du début de Force, et s'il ne le trouve pas, renvoie -1. Donc, si nous trouvons la Force dans les pouvoirs, poussez ce tableau vers un nouveau tableau.
Vous pouvez faire quelque chose comme ceci:
Array.prototype.containsPattern = function(elem) { var results = []; for (var i in this) { if (this[i].toString().includes(elem)) { results.push(this[i]); } } return results; } var fruits = ["Banana", "Orange", "Apple", "1,Mango", "2,Mango"]; var n = fruits.containsPattern("Mango");
Dans ce cas, cette fonction va renvoyer ceci: 1, Mango, 2, Mango. Et la meilleure chose à faire est que vous pouvez personnaliser la fonction pour faire ce que vous voulez.
J'espère que cela vous aidera, bravo.
Il y a beaucoup de mauvaises idées ici, comme itérer sur un tableau avec for in
(ordre non garanti; récupérera les propriétés qui ne sont pas des éléments de tableau si elles sont ajoutées), la conversion en une chaîne avant d'utiliser < code> includes () , et l'ajout à Array.prototype
. (En fait, containsPattern
est ajouté comme énumérable, donc for in
le récupérera; vous vérifiez si le texte de la fonction inclut un modèle. fruits.containsPattern ("results")
renverra une valeur surprenante.) L'itération manuelle en général n'a également vraiment de sens que lorsque vous avez besoin d'une compatibilité ascendante, mais inclut
…
… Est ES6. L'approche de Highlow est la bonne réponse rétrocompatible jusqu'à IE9 et autres.
@Ry: (IMO) Je pense qu'il est plus facile d'ajouter simplement le polyfill pour Array.filter
si vous avez besoin de prendre en charge aussi loin
@mwilson: Désolé, pas le juste. Juste par rapport à cela. Impossible de pointer vers le vôtre à cette fin, car il utilise également une fonction de flèche.
Savez-vous comment vérifier si un seul tableau, comme
["Strength", "Flying"]
, contient"Strength"
?