0
votes

Comment regrouper une gamme d'objets par clé et résume une propriété d'objet imbriquée

J'ai une gamme d'objets de produit, chaque produit contient le prix du produit en plus d'un objet imbriqué représentant la devise utilisée. XXX PRE>

Qu'est-ce que j'essaie de faire est d'obtenir un tableau avec Un objet unique par monnaie avec sa somme de prix, de préférence à l'aide d'un script Lodash ou ES6. Ce dont j'ai besoin, c'est pourquoi: P>

{
    "Euro":[
        {"currency":"Euro","price":"300"}
    ],
    "Dolar":[
        {"currency":"Dolar","price":"100"},
        {"currency":"Dolar","price":"50"}
    ]
}


1 commentaires

@Certeperformance J'ai modifié le code, juste une faute de frappe. Je dois résumer les objets avec la même monnaie, aucune soustraction du tout.


3 Réponses :


2
votes

supposer que vous voulez résumer les totaux et obtenir un total d'euro de 300:

itérer sur chaque de devise.name code> et Price code>, transformant l'entrée en Un objet dont les clés sont les noms de devises et les valeurs sont le prix cumulatif de ce nom de devise trouvé jusqu'à présent. À la fin, cartographiez les entrées de l'objet pour obtenir une matrice d'objets de votre format souhaité: p>

p>

var products = [
{
    'id': '1',
    'currency': { id:1, name:'Dollar' },
    'price': '100'
}, {
    'id': '4',
    'currency': { id:2, name:'Euro' },
    'price': '300'
}, {
    'id': '6',
    'currency': { id:1, name:'Dollar' },
    'price': '50'
}, {
    'id': '16',
    'currency': null,
    'price': '50'
}, {
    'id': '23',
    'currency': { id:2, name:'Euro' },
    'price': null
}
];

const pricesByName = {};
for (const { currency, price } of products) {
  if (price === null || currency === null) continue;
  const { name } = currency;
  pricesByName[name] = (pricesByName[name] || 0) + Number(price);
}
const output = Object.entries(pricesByName)
  .map(([currency, total]) => ({ currency, total }));
console.log(output);


3 commentaires

A l'air bien, mais il échoue lorsqu'un produit n'a aucun objet de devise. Veuillez noter que certains produits ne peuvent avoir aucun objet de devise en premier lieu. Ce code est en fait utilisé dans un getter VUEX qui va mutera pendant que l'utilisateur remplit un formulaire, de sorte que le prix pourrait être aussi 0 ou une valeur vide.


Tous les objets de votre exemple d'entrée ont un tel objet. Quel type de logique voudriez-vous quand il n'y a pas d'objet, voudriez-vous simplement ne rien faire sur cette itération?


J'ai édité le code une fois de plus, désolé pour la négligence. Ces objets contenant un objet de devise nulle ou un prix NULL peuvent être ignorés dans le résultat car ils n'affectent pas la somme.



1
votes

Utilisation de Lodash, vous pouvez regrouper par la propriété NAME CODE> de l'objet de devise à l'aide de _. Groupby () code>. Puis cartographier l'objet de résultat à un tableau d'objets. L'objet que vous mappez pour peut utiliser la clé comme devise et le total de la matrice regroupée (en utilisant _. Sumby () code>) comme total:

P>

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


5 commentaires

Vraiment belle approche, tout moyen d'ignorer ces objets avec un objet de devise nul ou NULL / 0 Price? Il renvoie un objet de tableau {devise: "non défini", total: 123456} quand il se produit.


@LUCIANO Vous pouvez filtrer tous les objets qui ne disposent pas de la propriété de devise.name (prix avec null sera traité comme 0 en raison de Opérateur Unair Plus + prix )


En supposant que le produit.Currency peut également contenir (ou non) un objet imbriqué «Current_Quation» avec une propriété «citation» à l'intérieur, comment puis-je renvoyer une propriété supplémentaire de Getsubtotals () à la suite de (Total * Devise.Current_quotation.Quation) ? Est-ce possible?


De plus, si aucun objet actuel_quotation n'existe, la propriété supplémentaire doit être identique à la valeur de la propriété totale.


@LUCIANO J'ai modifié mon code pour ajouter une propriété supplémentaire contenant le Total * devise.Current_Quotation.Quotation



0
votes

J'ai écrit cela dans la console et cela devrait fonctionner pour votre cas:

var products = [
    {
        id: '1',
        currency: { id: 1, name: 'Dollar' },
        price: '100',
    },
    {
        id: '4',
        currency: { id: 2, name: 'Euro' },
        price: '300',
    },
    {
        id: '6',
        currency: { id: 1, name: 'Dollar' },
        price: '50',
    },
];

subtotals = {};

products.map(x => {
    if(x.currency !== null){
        subtotals[x.currency.name] === undefined
            ? (subtotals[x.currency.name] = parseInt(x.price))
            : (subtotals[x.currency.name] += parseInt(x.price));
    }
});


0 commentaires