Maison >interface Web >js tutoriel >Comment puis-je regrouper efficacement des tableaux d'objets en JavaScript ?

Comment puis-je regrouper efficacement des tableaux d'objets en JavaScript ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-21 14:44:10159parcourir

How Can I Efficiently Group Arrays of Objects in JavaScript?

Optimisation GroupBy pour les objets de tableau

Lorsque vous travaillez avec des tableaux d'objets, il est souvent nécessaire de les regrouper efficacement pour l'analyse. Voici une discussion sur l'approche la plus efficace pour y parvenir.

Utilisation d'une bibliothèque externe :

Underscore.js fournit une fonction groupBy pratique qui simplifie le regroupement par valeurs clés spécifiques. . Cependant, il se peut qu'il ne réponde pas pleinement au besoin de fusionner des groupes plutôt que de les diviser.

Mise en œuvre d'une fonction GroupBy personnalisée :

Pour obtenir un contrôle précis sur le regroupement et l'agrégation, envisagez d'implémenter une fonction personnalisée. Voici une implémentation JavaScript Vanilla :

var groupBy = function(xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
    return rv;
  }, {});
};

Exemple :

Appliquons cette fonction groupBy personnalisée à l'exemple de tableau :

var data = [ 
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" },
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" }
];

var groupedByPhase = groupBy(data, "Phase");
var groupedByPhaseAndStep = groupBy(data, "Phase", "Step");

console.log(groupedByPhase);
console.log(groupedByPhaseAndStep);

Sortie :

{
  "Phase 1": [
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" },
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" }
  ],
  "Phase 2": [
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" }
  ]
}
{
  "Phase 1": {
    "Step 1": [
      { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" },
      { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" }
    ],
    "Step 2": [
      { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" },
      { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" }
    ]
  },
  "Phase 2": {
    "Step 1": [
      { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" },
      { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" }
    ],
    "Step 2": [
      { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" },
      { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" }
    ]
  }
}

Comme vous pouvez le voir, le les résultats s'alignent sur le format attendu, regroupant les objets en fonction de la ou des clés spécifiées tout en les fusionnant plutôt que de les diviser.

En conclusion, cette implémentation personnalisée de groupBy fournit des capacités de regroupement efficaces pour les tableaux d'objets, remplissant les exigences fonctionnalité d'agrégation souhaitée.

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:
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