Quelqu'un connaît-il un moyen (lodash si possible aussi) de regrouper un tableau d'objets par une clé d'objet, puis de créer un nouveau tableau d'objets basé sur le regroupement? Par exemple, j'ai un tableau d'objets voiture:
var cars = [
{
'make': 'audi',
'model': 'r8',
'year': '2012'
}, {
'make': 'audi',
'model': 'rs5',
'year': '2013'
}, {
'make': 'ford',
'model': 'mustang',
'year': '2012'
}, {
'make': 'ford',
'model': 'fusion',
'year': '2015'
}, {
'make': 'kia',
'model': 'optima',
'year': '2012'
},
];
Je souhaite créer un nouveau tableau d'objets voiture regroupés par make
:
var cars = {
'audi': [
{
'model': 'r8',
'year': '2012'
}, {
'model': 'rs5',
'year': '2013'
},
],
'ford': [
{
'model': 'mustang',
'year': '2012'
}, {
'model': 'fusion',
'year': '2015'
}
],
'kia': [
{
'model': 'optima',
'year': '2012'
}
]
}
groupBy
?Réponses:
La réponse de Timo est comment je le ferais. Facile
_.groupBy
, et autorise certaines duplications dans les objets de la structure groupée.Cependant, l'OP a également demandé la
make
suppression des clés en double . Si vous vouliez aller jusqu'au bout:Rendements:
Si vous vouliez faire cela en utilisant Underscore.js, notez que sa version de
_.mapValues
est appelée_.mapObject
.la source
En Javascript brut, vous pouvez utiliser
Array#reduce
avec un objetla source
result
résultats?Object.entries
et parcourir les paires clé / valeur.make
de données une fois groupé? Cela prend plus de place.Vous recherchez
_.groupBy()
.La suppression de la propriété par laquelle vous regroupez des objets devrait être triviale si nécessaire:
En prime, vous obtenez une syntaxe encore plus agréable avec les fonctions fléchées ES6:
la source
var grouped = _.groupBy(cars, 'make');
pas besoin de fonction du tout, si l'accesseur est un simple nom de propriété.La version courte pour regrouper un tableau d'objets par une certaine clé dans es6:
La version plus longue:
Il semble que la question d'origine demande comment regrouper les voitures par marque, mais omettez la marque dans chaque groupe. La réponse ressemblerait donc à ceci:
la source
Voici votre propre
groupBy
fonction qui est une généralisation du code de: https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscorela source
la source
Je laisserais
REAL GROUP BY
pour l'exemple JS Arrays exactement la même tâche icila source
Vous pouvez essayer de modifier l'objet à l'intérieur de la fonction appelée par itération par _.groupBy func. Notez que le tableau source change ses éléments!
la source
make
propriété, et elle est également plus lisible.C'est également possible avec une simple
for
boucle:la source
for ( let { TABLE_NAME, ...fields } of source) { result[TABLE_NAME] = result[TABLE_NAME] || []; result[TABLE_NAME].push({ ...fields }); }
Pour les cas où la clé peut être nulle et que nous voulons les regrouper comme d' autres
la source
Créer une méthode qui peut être réutilisée
Ensuite, ci-dessous, vous pouvez regrouper selon n'importe quel critère
la source
Version prototype utilisant également ES6. Fondamentalement, cela utilise la fonction de réduction pour transmettre un accumulateur et un élément actuel, qui l'utilise ensuite pour créer vos tableaux "groupés" en fonction de la clé transmise. la partie interne de la réduction peut sembler compliquée, mais essentiellement, elle teste pour voir si la clé de l'objet transmis existe et si elle ne crée pas un tableau vide et ajoute l'élément actuel à ce tableau nouvellement créé, sinon en utilisant la propagation L'opérateur passe tous les objets du tableau de clés actuel et ajoute l'élément actuel. J'espère que cela aide quelqu'un !.
la source
Vous pouvez également utiliser une
array#forEach()
méthode comme celle-ci:la source
la source
Essayez simplement celui-ci, cela fonctionne bien pour moi.
let grouped = _.groupBy(cars, 'make');
la source
J'ai fait un benchmark pour tester les performances de chaque solution qui n'utilise pas de bibliothèques externes.
JSBen.ch
L'
reduce()
option, publiée par @Nina Scholz semble être la meilleure.la source
J'ai aimé la réponse @metakunfu, mais elle ne fournit pas exactement le résultat attendu. Voici une mise à jour qui supprime "make" dans la charge utile JSON finale.
Production:
la source
Avec lodash / fp, vous pouvez créer une fonction avec
_.flow()
ce premier groupe par une touche, puis mapper chaque groupe et omettre une clé de chaque élément:la source
En vous appuyant sur la réponse de @Jonas_Wilms si vous ne souhaitez pas saisir tous vos champs:
Je n'ai pas fait de benchmark, mais je pense que l'utilisation d'une boucle for serait plus efficace que tout ce qui est suggéré dans cette réponse .
la source
la source
Tableau d'objet groupé en texte manuscrit avec ceci:
la source
J'adore l'écrire sans dépendance / complexité juste des js simples et purs.
la source
Voici une autre solution. Comme demandé.
Production:
la source
Voici une solution inspirée de Collectors.groupingBy () en Java:
Cela donnera un objet Map.
la source