2
votes

Objet de filtrage basé sur une correspondance de chaîne partielle en JavaScript

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.


1 commentaires

Savez-vous comment vérifier si un seul tableau, comme ["Strength", "Flying"] , contient "Strength" ?


3 Réponses :


3
votes

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.


0 commentaires

1
votes

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.


0 commentaires

-1
votes

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.


4 commentaires

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.