? C'est enfin sorti ! Plus besoin d'écrire du code laid pour regrouper un tableau d'objets en fonction d'une valeur spécifique d'un champ !
Depuis fin 2023, il existe une méthode statique officielle pour Object appelée groupBy() qui le fait pour nous !
Il accepte un Iterable, tel qu'un Array, et une fonction, qui est exécutée pour chaque élément et doit renvoyer la "catégorie" de cet élément spécifique.
La méthode renvoie un nouvel objet où chaque clé est une catégorie différente contenant un tableau d'objets appartenant à cette catégorie spécifique.
REMARQUE : les éléments de l'objet renvoyé et de l'itérable d'origine sont les mêmes (pas de copies complètes !). La modification de la structure interne des éléments sera reflétée à la fois dans l'itérable d'origine et dans l'objet renvoyé.
Donnons un exemple pratique pour voir à quel point il est facile de regrouper tous les personnages des Tortues Ninja par âge.
const ninjaTurtlesCharacters = [ { age: 16, name: 'Michelangelo' }, { age: 16, name: 'Raffaello' }, { age: 16, name: 'Donatello' }, { age: 16, name: 'Leonardo' }, { age: 91, name: 'Splinter' }, { age: 25, name: 'Casey Jones' }, { age: 25, name: 'April O\'Neil' } ];
const ninjaTurtlesCharactersByAge = ninjaTurtlesCharacters.reduce( (groupedPeople, item) => ({ ...groupedPeople, [item.age]: groupedPeople[item.age] ? [...groupedPeople[item.age], item] : [item], }), {} );
const ninjaTurtlesCharactersByAgeNew = Object.groupBy( ninjaTurtlesCharacters, ({ age }) => age );
Astuce : utilisez Map.groupBy() si vous souhaitez renvoyer une carte au lieu d'un objet
{ "16": [ { age: 16, name: 'Michelangelo' }, { age: 16, name: 'Raffaello' }, { age: 16, name: 'Donatello' }, { age: 16, name: 'Leonardo' } ], "25": [ { age: 25, name: 'Casey Jones' }, { age: 25, name: 'April O\'Neil' } ], "91": [ { age: 91, name: 'Splinter' } ] }
??? Comme d'habitude, j'ai créé un projet Stackblitz simple pour jouer avec le code.
? Documents : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy
ℹ Prise en charge du navigateur : https://caniuse.com/mdn-javascript_builtins_object_groupby
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