Regrouper des objets par plusieurs propriétés et additionner leurs valeurs
En JavaScript, il est courant de travailler avec des tableaux d'objets. Parfois, il est nécessaire de regrouper ces objets selon plusieurs propriétés tout en effectuant des calculs sur leurs valeurs, par exemple en résumant des propriétés spécifiques.
Aperçu du problème
Étant donné un tableau d'objets , nous visons à les regrouper en fonction de deux propriétés (forme et couleur). Cependant, nous souhaitons traiter les objets comme des doublons uniquement si leur forme et leur couleur correspondent. L'objectif est de résumer les propriétés utilisées et d'instances des objets au sein de chaque groupe et de supprimer tous les doublons.
Résultat attendu
En utilisant l'exemple de tableau suivant :
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} ];
Nous espérons obtenir un tableau avec quatre groupes :
[{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}]
Solution utilisant Array#reduce et Object#assign
Pour y parvenir, nous pouvons utiliser la méthode Array#reduce de JavaScript pour parcourir le tableau d'objets. Pour chaque objet, nous construisons une clé unique en concaténant les propriétés de forme et de couleur. Nous utilisons ensuite un objet auxiliaire, helper, pour garder une trace des objets regroupés.
var helper = {}; var result = arr.reduce(function(r, o) { var key = o.shape + '-' + o.color; if(!helper[key]) { helper[key] = Object.assign({}, o); // create a copy of o r.push(helper[key]); } else { helper[key].used += o.used; helper[key].instances += o.instances; } return r; }, []);
Si la clé n'existe pas dans l'objet helper, nous ajoutons une nouvelle entrée en utilisant Object.assign() pour créer une nouvelle copie de l'objet actuel. Nous poussons ensuite ce nouvel objet dans le tableau de résultats.
Si la clé existe déjà dans l'assistant, cela signifie que nous avons rencontré un doublon. Dans ce cas, nous incrémentons simplement les propriétés used et instances de l'objet correspondant dans helper.
Enfin, nous renvoyons le tableau de résultats, qui regroupe efficacement les objets par forme et couleur tout en additionnant leurs valeurs.
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!