J'ai un problème que je ne parviens pas à résoudre. J'ai un tas de tableaux qui sont regroupés par une propriété:
[ {SendFrom: 'Customer 1', Price: 1380, Amount: 13}, {SendFrom: 'Customer 2', Price: 1380, Amount: 13}, {SendFrom: 'Customer 3', Price: 2080, Amount: 13} ]
Dans cet exemple, les objets sont regroupés par propriété SendFrom.
Ce que j'essaie de faire est de créer un objet comme celui-ci:
[ [ {Id: '211321', SendFrom: 'Customer 1', Price: 120, Amount: 2}, {Id: '211341', SendFrom: 'Customer 1', Price: 320, Amount: 5}, {Id: '212351', SendFrom: 'Customer 1', Price: 300, Amount: 2}, {Id: '234121', SendFrom: 'Customer 1', Price: 230, Amount: 3}, {Id: '223321', SendFrom: 'Customer 1', Price: 410, Amount: 1} ], [ {Id: '2321', SendFrom: 'Customer 2', Price: 120, Amount: 2}, {Id: '21341', SendFrom: 'Customer 2', Price: 320, Amount: 5}, {Id: '2351', SendFrom: 'Customer 2', Price: 300, Amount: 2}, {Id: '4121', SendFrom: 'Customer 2', Price: 230, Amount: 3}, {Id: '3321', SendFrom: 'Customer 2', Price: 410, Amount: 1} ], [ {Id: '3453', SendFrom: 'Customer 3', Price: 520, Amount: 2}, {Id: '4334', SendFrom: 'Customer 3', Price: 220, Amount: 5}, {Id: '2343', SendFrom: 'Customer 3', Price: 700, Amount: 2}, {Id: '6654', SendFrom: 'Customer 3', Price: 430, Amount: 3}, {Id: '4534', SendFrom: 'Customer 3', Price: 210, Amount: 1} ] ]
Le nouvel objet conserve la valeur d'origine SendFrom mais contient des valeurs mises à jour pour les propriétés Price et Amount.
Comment puis-je obtenir cela avec JavaScript ou avec l'aide de lodash?
Meilleures salutations, Americo
3 Réponses :
var groupBy = function(xs, key) { return xs.reduce(function(rv, x) { (rv[x[key]] = rv[x[key]] || []).push(x); return rv; }, {}); }; console.log(groupBy(['one', 'two', 'three'], 'length')); // => {3: ["one", "two"], 5: ["three"]}
pensez à ajouter des explications à votre réponse.
Vous pouvez prendre un objet pour le regrouper et ajouter toutes les valeurs souhaitées à leurs propriétés. À la fin, ne prenez que les valeurs de l'objet.
.as-console-wrapper { max-height: 100% !important; top: 0; }
var data = [[{ Id: '211321', SendFrom: 'Customer 1', Price: 120, Amount: 2 }, { Id: '211341', SendFrom: 'Customer 1', Price: 320, Amount: 5 }, { Id: '212351', SendFrom: 'Customer 1', Price: 300, Amount: 2 }, { Id: '234121', SendFrom: 'Customer 1', Price: 230, Amount: 3 }, { Id: '223321', SendFrom: 'Customer 1', Price: 410, Amount: 1 }], [{ Id: '2321', SendFrom: 'Customer 2', Price: 120, Amount: 2 }, { Id: '21341', SendFrom: 'Customer 2', Price: 320, Amount: 5 }, { Id: '2351', SendFrom: 'Customer 2', Price: 300, Amount: 2 }, { Id: '4121', SendFrom: 'Customer 2', Price: 230, Amount: 3 }, { Id: '3321', SendFrom: 'Customer 2', Price: 410, Amount: 1 }], [{ Id: '3453', SendFrom: 'Customer 3', Price: 520, Amount: 2 }, { Id: '4334', SendFrom: 'Customer 3', Price: 220, Amount: 5 }, { Id: '2343', SendFrom: 'Customer 3', Price: 700, Amount: 2 }, { Id: '6654', SendFrom: 'Customer 3', Price: 430, Amount: 3 }, { Id: '4534', SendFrom: 'Customer 3', Price: 210, Amount: 1 }]], grouped = Object.values(data.flat().reduce((r, { SendFrom, Price, Amount }) => { r[SendFrom] = r[SendFrom] || { SendFrom, Price: 0, Amount: 0 }; r[SendFrom].Price += Price; r[SendFrom].Amount += Amount; return r; }, {})); console.log(grouped);
Merci, cela a fonctionné comme j'avais besoin. Et merci @Yevgen pour l'explication. Je vais le sauvegarder pour l'étudier, c'est bien que ça marche, c'est mieux si je comprends comment ça marche
@AmericoPerez: appréciez votre réponse, j'espère que vous avez copié ce dont vous avez besoin car j'ai supprimé ma réponse
var groupBy = function(xs, key) { return xs.reduce(function(rv, x) { (rv[x[key]] = rv[x[key]] || []).push(x); return rv; }, {}); }; console.log(groupBy(your_array_name, 'SendFrom'));
Il est recommandé d'expliquer comment votre code adresse / résout la question de l'OP. Les réponses au code uniquement sont mal vues. L'ajout d'informations permet aux visiteurs de zoomer rapidement sur les éléments importants, est plus rapide à digérer de manière cognitive et aide les visiteurs du feu à apprendre et à appliquer leurs connaissances à leur propre code. Cela favorise alors les questions et réponses pour la connaissance, plutôt que "donnez-moi le code" en tant que service Q et A. Cela permet également de maintenir une qualité élevée pour SO en tant que plate-forme.
Votre entrée ne semble pas correcte. Ce n'est ni un tableau ni un objet. De plus, vous n'avez pas spécifié «comment» la mise à jour de la sortie. Sera-t-il toujours la somme de tous les prix et montants dans un groupe?
Salut Rahul, oui, il additionnera toujours tous les prix et montants d'un groupe. En ce qui concerne l'entrée, j'étais presque sûr qu'il s'agissait d'un tableau d'objets mais je peux me tromper.
Découvrez la solution @Nina Scholz ci-dessous. C'est plutôt bon et semble avoir également corrigé l'entrée.