"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment regrouper des objets par plusieurs propriétés et agréger des valeurs en JavaScript ?

Comment regrouper des objets par plusieurs propriétés et agréger des valeurs en JavaScript ?

Publié le 2024-12-25
Parcourir:580

How to Group Objects by Multiple Properties and Aggregate Values in JavaScript?

Regroupement d'objets par plusieurs propriétés et agrégation de valeurs

Dans la tâche de regroupement d'objets dans un tableau par plusieurs propriétés, une exigence courante est de non seulement regrouper par ces propriétés, mais résumer également les valeurs de certaines propriétés d'objet. Cependant, une solution qui imbrique simplement tous les doublons dans un tableau à deux dimensions est insuffisante.

Énoncé du problème

Considérons un tableau d'objets qui doivent être regroupés par forme et couleur. Les objets de ce tableau sont considérés comme des doublons uniquement si leur forme et leur couleur sont identiques. Pour les objets en double, nous devons résumer leurs valeurs utilisées et d'instances et supprimer les doublons, ce qui donne une liste concise d'objets avec des formes et des couleurs uniques.

Solution

Pour résoudre efficacement ce problème, nous pouvons exploiter la méthode Array#reduce en conjonction avec un objet d'assistance qui suit les combinaisons de formes et de couleurs rencontrées :

const arr = [
  { shape: 'square', color: 'red', used: 1, instances: 1 },
  { shape: 'square', color: 'red', used: 2, instances: 1 },
  { shape: 'circle', color: 'blue', used: 0, instances: 0 },
  { shape: 'square', color: 'blue', used: 4, instances: 4 },
  { shape: 'circle', color: 'red', used: 1, instances: 1 },
  { shape: 'circle', color: 'red', used: 1, instances: 0 },
  { shape: 'square', color: 'blue', used: 4, instances: 5 },
  { shape: 'square', color: 'red', used: 2, instances: 1 },
];

const helper = {};
const result = arr.reduce((r, o) => {
  const key = `${o.shape}-${o.color}`;

  if (!helper[key]) {
    // If it's a unique combination, add to the helper and result array
    helper[key] = Object.assign({}, o);
    r.push(helper[key]);
  } else {
    // If it's a duplicate, update the values in the helper
    helper[key].used  = o.used;
    helper[key].instances  = o.instances;
  }

  return r;
}, []);

console.log(result);

Sortie :

[
  { shape: "square", color: "red", used: 5, instances: 3 },
  { shape: "circle", color: "red", used: 2, instances: 1 },
  { shape: "square", color: "blue", used: 11, instances: 9 },
  { shape: "circle", color: "blue", used: 0, instances: 0 }
]

Cette solution regroupe efficacement les objets par forme et couleur, agrège leurs valeurs utilisées et d'instances pour les objets en double et supprime tous les doublons restants, ce qui donne le résultat souhaité.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3