1
votes

Regrouper les objets dans des tableaux imbriqués dans un tableau de sous-totaux par propriété commune

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 commentaires

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.


3 Réponses :


-1
votes
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"]}

1 commentaires

pensez à ajouter des explications à votre réponse.



2
votes

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);


2 commentaires

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



0
votes
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'));

1 commentaires

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.