Table des matières
introduction
Scénarios de problème et structure de données
Analyse des malentendus communs
Solution: Utilisez Filter (), certains (), chaque combinaison ()
Analyse de code
Notes et meilleures pratiques
Résumer
Maison interface Web js tutoriel Guide pour filtrer efficacement les tableaux d'objets imbriqués basés sur des conditions complexes en JavaScript

Guide pour filtrer efficacement les tableaux d'objets imbriqués basés sur des conditions complexes en JavaScript

Oct 01, 2025 am 07:48 AM

Guide pour filtrer efficacement les tableaux d'objets imbriqués basés sur des conditions complexes en JavaScript

Ce tutoriel plongera dans la façon d'utiliser Filter (), certaines () et toutes les méthodes () en JavaScript pour filtrer efficacement un autre tableau contenant des options d'objets imbriquées basées sur un ensemble complexe de tableaux conditionnels. Nous utiliserons un vrai cas pour analyser en détail comment créer une logique pour réaliser un filtrage précis des données, garantissant que seuls les éléments qui correspondent toutes les conditions spécifiées sont conservées.

introduction

Dans le développement Web moderne, le traitement et le filtrage des structures de données complexes sont une tâche courante. Surtout lorsque les données existent sous la forme de réseaux d'objets imbriqués et de conditions de filtrage sont également complexes, comment écrire du code à la fois efficace et facile à lire devient un défi. Ce didacticiel se concentrera sur un scénario typique: filtrer le tableau de données principal basé sur un tableau d'objets contenant plusieurs sous-conditions, où chaque élément du tableau de données principal contient également un tableau d'options d'options. Nous utiliserons les puissantes fonctions d'ordre supérieur de JavaScript Filter (), certains () et chaque () pour résoudre ce problème gracieusement.

Scénarios de problème et structure de données

Supposons que nous ayons une gamme de produits, chaque objet de produit contient une gamme d'options, qui décrit diverses propriétés du produit (telles que la taille, la couleur). Dans le même temps, nous avons également un tableau de condition qui définit les conditions que nous devons remplir pour les produits que nous voulons filtrer. Chaque condition elle-même est également un tableau contenant plusieurs paires d'attribut / valeur, indiquant qu'un produit doit satisfaire ces attributs en même temps avant qu'il ne puisse être sélectionné.

Exemple de données d'origine:

 Const Products = [
  {
    Options: [
       {id: 1, nom: 'size', valeur: '10'},
       {id: 2, nom: 'couleur', valeur: 'jaune'},
    ],
  },
  {
    Options: [
       {id: 1, nom: 'size', valeur: '20'},
       {id: 2, nom: 'couleur', valeur: 'jaune'},
    ],
  },
  {
    Options: [
      {id: 1, nom: 'size', valeur: '10'},
      {id: 2, nom: 'couleur', valeur: 'rose'},
    ],
  },
  { 
    Options: [
      {id: 1, nom: 'size', valeur: '20'},
      {id: 2, nom: 'couleur', valeur: 'rose'}
    ],
  },
  {
    Options: [
      {id: 1, nom: 'size', valeur: '39'},
      {id: 2, nom: 'couleur', valeur: 'rose'},
    ],
   },
]]

Exemple de critères de filtre:

 Conditions const = [
  [
    {nom: 'size', valeur: '10'},
    {nom: 'couleur', valeur: 'jaune'},
  ],
  [
    {nom: 'size', valeur: '10'},
    {nom: 'Color', valeur: 'rose'},
  ],
]]

Notre objectif est de filtrer tous les produits qui répondent à tout tableau conditionnel. Par exemple, si un produit rencontre à la fois "taille 10 et couleur jaune" ou "taille 10 et couleur rose" en même temps, le produit doit être inclus dans les résultats.

Sortie attendue:

 const OutputProducts = [
  {
    Options: [
      {id: 1, nom: 'size', valeur: '10'},
      {id: 2, nom: 'couleur', valeur: 'jaune'},
    ],
  },
  {
    Options: [
      {id: 1, nom: 'size', valeur: '10'},
      {id: 2: 'couleur', valeur: 'rose'},
    ],
  },
]]

Analyse des malentendus communs

Lorsque vous essayez de résoudre de tels problèmes, une erreur courante pour les débutants est de confondre certains () et tous les scénarios applicables (), ou de ne pas faire correspondre correctement la logique dans les boucles imbriquées. Par exemple, le code provisoire suivant, bien que l'utilisation du filtre, de la recherche et de chaque, n'a pas réussi à obtenir les résultats attendus:

 const FilterProducts = ProductS.Filter ((el) => {
   return el.options.find ((o) => {// Options du produit de traversée Return condition.find ((m) => {// Groupes de conditions de traversée // La logique ici est mauvaise: il essaie de faire une option de produit `o` correspondez à toutes les sous-conditions de l'ensemble du groupe de conditions de condition` M`.
       // En fait, nous devons vérifier si toutes les options «el.options» d'un produit répondent à toutes les sous-conditions du groupe de conditions «M».
       return M.Every (({name, value}) => o.name == name && o.value === valeur);
     });
   });
 });

L'erreur du code ci-dessus est que ce qui est attendu en interne par M.Every (...) est de vérifier si chaque sous-condition dans le tableau M est satisfaite par O (option de produit unique). Cependant, une option de produit O ne représente généralement qu'un seul attribut (tel que la taille ou la couleur), et il est impossible de satisfaire toutes les sous-conditions dans le groupe de condition M en même temps (par exemple, O ne peut pas être à la fois la taille: «10» et la couleur: «jaune»). La logique correcte doit être que pour chaque sous-condition d'un groupe de conditions M, nous devons vérifier s'il existe une option de correspondance dans le tableau d'options du produit actuel.

Solution: Utilisez Filter (), certains (), chaque combinaison ()

La clé pour résoudre ce problème est de nidiquer correctement Filter (), certains () et chaque () pour créer des flux logiques précis.

  1. Filter () : la couche la plus externe, utilisée pour traverser le tableau des produits et filtrer les produits individuels qui répondent aux critères.
  2. certains () (première couche interne) : traverse le tableau des conditions. Pour chaque produit, nous devons vérifier s'il satisfait un groupe de conditions dans le tableau des conditions. Tant qu'un groupe d'états est rempli, le produit doit être conservé.
  3. chaque () (deuxième couche interne) : itéère sur la condition actuellement sélectionnée (un groupe de conditions, par exemple [{nom: 'size', valeur: '10'}, {name: 'couleur', valeur: 'jaune'}]). Pour chaque sous-condition de ce groupe de conditions (par exemple {nom: 'taille', valeur: '10'}), le produit doit le satisfaire.
  4. un peu () (troisième couche interne) : itère sur le tableau des options du produit actuel. Pour chaque sous-condition dans chaque (), nous devons vérifier s'il y a au moins une option dans les options de produit qui la correspondent.

Code de solution complet:

 Const Products = [
  {
    Options: [
       {id: 1, nom: 'size', valeur: '10'},
       {id: 2, nom: 'couleur', valeur: 'jaune'},
    ],
  },
  {
    Options: [
       {id: 1, nom: 'size', valeur: '20'},
       {id: 2, nom: 'couleur', valeur: 'jaune'},
    ],
  },
  {
    Options: [
      {id: 1, nom: 'size', valeur: '10'},
      {id: 2, nom: 'couleur', valeur: 'rose'},
    ],
  },
  { 
    Options: [
      {id: 1, nom: 'size', valeur: '20'},
      {id: 2, nom: 'couleur', valeur: 'rose'}
    ],
  },
  {
    Options: [
      {id: 1, nom: 'size', valeur: '39'},
      {id: 2, nom: 'couleur', valeur: 'rose'},
    ],
   },
]]

Conditions const = [
  [
    {nom: 'size', valeur: '10'},
    {nom: 'couleur', valeur: 'jaune'},
  ],
  [
    {nom: 'size', valeur: '10'},
    {nom: 'Color', valeur: 'rose'},
  ],
]]

const FilterProducts = ProductS.filter (produit =>
  // 1. Pour chaque produit, vérifiez s'il satisfait un groupe de conditions dans les conditions de tableau des «conditions».
    // 2. Pour la «condition» du groupe des conditions actuelles, vérifiez si toutes ses sous-conditions sont satisfaites par la condition du produit.
      // 3. Pour chaque sous-condition en 'condition' (comme {name: 'size', valeur: '10'}),
      // Vérifiez s'il existe une option de correspondance dans le tableau 'Options' du produit actuel produit.options.some (option => option.name === name && option.value === valeur)
    )
  )
));

console.log (filterProducts);
/ *
Résultat de sortie:
[
  {
    Options: [
      {id: 1, nom: 'size', valeur: '10'},
      {id: 2, nom: 'couleur', valeur: 'jaune'}
    ]]
  },
  {
    Options: [
      {id: 1, nom: 'size', valeur: '10'},
      {id: 2, nom: 'couleur', valeur: 'rose'}
    ]]
  }
]]
* /

Analyse de code

  • ProductS.filter (produit => ...) : Il s'agit du point de départ de l'ensemble de l'opération de filtrage. Il itère sur chaque objet de produit de la matrice de produits. Si la fonction anonyme interne renvoie true, le produit sera inclus dans le tableau des résultats des producteurs de filtre.
  • Conditions.Some (condition => ...) : Pour le produit actuel, nous vérifions le tableau des conditions. La méthode Some () itérera sur chaque condition dans les conditions (c'est-à-dire un groupe de conditions). Tant qu'une fonction de rappel interne d'un groupe de conditions renvoie vrai, certains () seront immédiatement renvoyés vrai, indiquant que le produit actuel répond au moins un groupe de conditions et est conservé par filtre.
  • Condition.Every (({nom, valeur}) => ...) : Lorsque certains () se transforment en groupe de conditions, la méthode chaque () vérifie toutes les sous-conditions de ce groupe de conditions (obtenir le nom et la valeur en déconstruire l'attribution). Chaque () ne revient que lorsque toutes les conditions des enfants du groupe de conditions sont satisfaites. Cela garantit que les produits que nous filtrons doivent répondre à tous les attributs au sein d'un groupe de conditions en même temps.
  • product.options.some (option => option.name === name && option.value === valeur) : il s'agit de la logique de correspondance la plus intérieure. Pour chaque condition infantile que la méthode chaque () vérifie (par exemple {nom: 'Size', valeur: '10'}), nous itraquons via le tableau des options du produit actuel. La méthode Some () vérifie s'il y a au moins une option dans Product.options, dont le nom et la valeur correspondent exactement à la condition infantile. Si elle est trouvée, Vrai est retourné, indiquant que la sous-condition est satisfaite.

Cette structure imbriquée implémente avec précision la logique que "le produit satisfait à tout groupe de conditions dans le tableau des conditions, et toutes les sous-conditions de chaque groupe de conditions sont appariées par n'importe quelle option du produit lui-même."

Notes et meilleures pratiques

  1. Clarité logique : bien que cette fonction d'ordre supérieur multicoule soit puissante, elle peut rendre le code difficile à comprendre et à maintenir s'il est abusé ou si la logique n'est pas claire. Assurez-vous que les responsabilités de chaque filtre, certains et chacun sont claires.
  2. Considérations de performances : pour les ensembles de données très importants, ces boucles imbriquées multicouches peuvent avoir des frais généraux de performance. Si les performances deviennent un goulot d'étranglement, d'autres stratégies d'optimisation peuvent être prises en compte, telles que les données de prétraitement, en utilisant la carte pour des recherches rapides, ou dans certains cas en utilisant des boucles traditionnelles pour un contrôle plus fin. Cependant, pour la plupart des scénarios d'application Web, cette approche est acceptable et a une meilleure lisibilité au code.
  3. Traitement vide du tableau : considérez le comportement lorsque les produits ou conditions sont des tableaux vides. Lors du traitement des tableaux vides, du filtre, certaines, chaque, etc. Les méthodes renvoient généralement les résultats attendus (par exemple, certains rendements faux sur les tableaux vides, et tout revient vrai), mais ils doivent toujours être testés en fonction de la logique métier spécifique.
  4. Égalité stricte : lors de la comparaison du nom et de la valeur, utilisez === (strictement égalité) au lieu de == pour éviter les problèmes de conversion de type potentiel.

Résumer

En combinant intelligemment Filter (), certaines () et toutes les méthodes () des tableaux JavaScript, nous pouvons résoudre efficacement et gracieusement le problème du filtrage des tableaux d'objets imbriqués basés sur des conditions complexes. Ce modèle offre non seulement de solides capacités de dépistage des données, mais améliore également la lisibilité et la déclarativité du code. Comprendre le comportement de ces fonctions d'ordre supérieur et leur applicabilité dans différents scénarios est une étape clé pour devenir un excellent développeur JavaScript. Face à des défis similaires de traitement des données, priorisez cette solution à la programmation fonctionnelle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

JavaScript réalise l'effet de commutation d'image click-through: tutoriel professionnel JavaScript réalise l'effet de commutation d'image click-through: tutoriel professionnel Sep 18, 2025 pm 01:03 PM

Cet article présentera comment utiliser JavaScript pour réaliser l'effet de cliquer sur les images. L'idée principale est d'utiliser l'attribut Data- * de HTML5 pour stocker le chemin d'image alternatif et écouter des événements de clic via JavaScript, changez dynamiquement les attributs SRC, réalisant ainsi la commutation d'image. Cet article fournira des exemples de code et des explications détaillés pour vous aider à comprendre et à maîtriser cet effet interactif couramment utilisé.

Comment obtenir l'emplacement de l'utilisateur avec l'API Geolocation en JavaScript? Comment obtenir l'emplacement de l'utilisateur avec l'API Geolocation en JavaScript? Sep 21, 2025 am 06:19 AM

Tout d'abord, vérifiez si le navigateur prend en charge GeolocationAPI. Si vous êtes pris en charge, appelez getCurrentPosition () pour obtenir les coordonnées de l'emplacement actuelles de l'utilisateur et obtenir les valeurs de latitude et de longitude grâce à des rappels réussis. Dans le même temps, fournissez des exceptions de traitement des rappels d'erreur tels que l'autorisation de déni, l'indisponibilité de l'emplacement ou du délai d'attente. Vous pouvez également transmettre des options de configuration pour activer une précision élevée, définir le délai d'expiration et la période de validité du cache. L'ensemble du processus nécessite l'autorisation de l'utilisateur et la gestion des erreurs correspondante.

Comment créer un intervalle répétitif avec SetInterval dans JavaScript Comment créer un intervalle répétitif avec SetInterval dans JavaScript Sep 21, 2025 am 05:31 AM

Pour créer un intervalle de répétition dans JavaScript, vous devez utiliser la fonction setInterval (), qui exécutera à plusieurs reprises des fonctions ou des blocs de code à des intervalles de millisecondes spécifiés. Par exemple, setInterval (() => {Console.log ("Exécuter toutes les 2 secondes");}, 2000) publiera un message toutes les 2 secondes jusqu'à ce qu'il soit effacé par ClearInterval (Interpalid). Il peut être utilisé dans les applications réelles pour mettre à jour les horloges, les serveurs de sondage, etc., mais faire attention à la limite de retard minimum et à l'impact du temps d'exécution de la fonction, et effacez l'intervalle dans le temps lorsqu'il n'est plus nécessaire pour éviter les fuites de mémoire. Surtout avant la désinstallation des composants ou la fermeture des pages, assurez-vous que

L'API de composition Nuxt 3 a expliqué L'API de composition Nuxt 3 a expliqué Sep 20, 2025 am 03:00 AM

L'utilisation du noyau de l'API de composition de Nuxt3 comprend: 1. DefinePageMeta est utilisée pour définir les méta-informations de la page, telles que le titre, la mise en page et le middleware, qui doivent être appelées directement et ne peuvent pas être placées dans des déclarations conditionnelles; 2. Usyhead est utilisé pour gérer les balises d'en-tête de page, prend en charge les mises à jour statiques et réactives et doit coopérer avec DefinePageMeta pour obtenir l'optimisation du référencement; 3. USEASYNCDATA est utilisé pour obtenir en toute sécurité des données asynchrones, gérer automatiquement l'état de chargement et d'erreur et prend en charge le contrôle d'acquisition de données du serveur et du client; 4. UseFetch est une encapsulation de usEasyncdata et $ fetch, qui dépente automatiquement la clé de demande pour éviter les demandes en double

Pièges et solutions communes pour l'accès à l'élément DOM en JavaScript Pièges et solutions communes pour l'accès à l'élément DOM en JavaScript Sep 15, 2025 pm 01:24 PM

Cet article vise à résoudre le problème du retour null lors de l'obtention d'éléments DOM via document.getElementById () dans JavaScript. Le noyau consiste à comprendre le synchronisation d'exécution du script et l'état de l'analyse DOM. En plaçant correctement la balise ou en utilisant l'événement téléchargé DomContent, vous pouvez vous assurer que l'élément est à nouveau tenté lorsqu'il est disponible, en évitant efficacement de telles erreurs.

Formatage des nombres en javascript: utilisez la méthode TofixEd () pour conserver les décimales fixes Formatage des nombres en javascript: utilisez la méthode TofixEd () pour conserver les décimales fixes Sep 16, 2025 am 11:57 AM

Ce tutoriel explique en détail comment formater les numéros en chaînes avec deux décimales fixes en JavaScript, même les entiers peuvent être affichés sous la forme de "# .00". Nous nous concentrerons sur l'utilisation de la méthode numéro.prototype.tofixed (), y compris sa syntaxe, sa fonctionnalité, son exemple de code et des points clés à noter, comme son type de retour étant toujours une chaîne.

Comment copier du texte dans le presse-papiers en javascript? Comment copier du texte dans le presse-papiers en javascript? Sep 18, 2025 am 03:50 AM

Utilisez la méthode WriteText de ClipboardAPI pour copier du texte dans le presse-papiers, il doit être appelé dans le contexte de sécurité et l'interaction utilisateur, prend en charge les navigateurs modernes et l'ancienne version peut être dégradée avec EXECCOMAND.

Comment créer une chaîne multi-lignes en JavaScript? Comment créer une chaîne multi-lignes en JavaScript? Sep 20, 2025 am 06:11 AM

ThebestatorreatEAmulti-linestringinjavascriptsisingstingTemplatalalswithbackticks, qui sepresereBreakenexactlyAswritten.

See all articles