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. 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"}
]
}
3 Réponses :
supposer que vous voulez résumer les totaux et obtenir un total d'euro de 300:
itérer sur chaque p> 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>
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);
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.
Utilisation de Lodash, vous pouvez regrouper par la propriété P> 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:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
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} code> quand il se produit.
@LUCIANO Vous pouvez filtrer tous les objets qui ne disposent pas de la propriété de devise.name code> (prix avec
null code> sera traité comme
0 code> en raison de Opérateur Unair Plus
+ prix code>)
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 code>
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)); } });
@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.