J'ai un tableau d'objets.
{
rev : {
2019 : [203441, 39670, 23612],
2018 : [41289, 21315, 24095],
},
exp : {
2019 : [69133, 29405, 25848],
2018 : [23698, 25274, 25725],
},
profit: {
2019 : [134308, 10265, -2236],
2018 : [17591, -3959, -1630],
}
}
Le but est d'abord de SOMMEZ dynamiquement toutes les valeurs clés dans un seul tableau en fonction de l'année et du monthNumber.
Le tableau d'origine n'est qu'un exemple, il y a plusieurs clés supplémentaires autres que 'exp', 'profit', etc. Je voudrais le rendre dynamique et éviter de mentionner chaque clé.
[
{year: 2018, monthNumber: 0, rev: 203441, exp: 69133, profit: 134308}
{year: 2019, monthNumber: 0, rev: 41289, exp: 23698, profit: 17591}
{year: 2018, monthNumber: 1, rev: 39670, exp: 29405, profit: 10265}
{year: 2019, monthNumber: 1, rev: 21315, exp: 25274, profit: -3959}
{year: 2018, monthNumber: 2, rev: 23612, exp: 25848, profit: -2236}
{year: 2019, monthNumber: 2, rev: 24095, exp: 25725, profit: -1630}
]
et ensuite atteindre le résultat souhaité ci-dessous:
let data = [
{year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459}
{year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849}
{year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579}
{year: 2019, monthNumber: 0, rev: 32354, exp: 11184, profit: 21170}
{year: 2018, monthNumber: 1, rev: 30620, exp: 16974, profit: 13646}
{year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381}
{year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472}
{year: 2019, monthNumber: 1, rev: 12265, exp: 12752, profit: -487}
{year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469}
{year: 2018, monthNumber: 2, rev: 13657, exp: 13424, profit: 233}
{year: 2019, monthNumber: 2, rev: 9050, exp: 12410, profit: -3360}
{year: 2019, monthNumber: 2, rev: 15045, exp: 13315, profit: 1730}
]
7 Réponses :
Vous devriez consulter OGX.List (téléchargeable en tant que support seul) et utilisez la fonction de groupe. Il regroupe un tableau de propriétés données. Puisque vous n'avez pas publié de code, je pense que vous cherchez une bibliothèque.
Pourriez-vous expliquer ce qu'est OGX.List et montrer comment utiliser la fonction de groupe? Les réponses aux liens uniquement peuvent devenir obsolètes à l'avenir si leur lien cesse de fonctionner.
Utilisez réduire et additionnez-les. Edit, a ajouté la possibilité de ne pas savoir quelles sont les clés.
let data = [
{year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459},
{year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849},
{year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579},
{year: 2019, monthNumber: 1, rev: 32354, exp: 11184, profit: 21170},
{year: 2018, monthNumber: 1, rev: 30620, exp: 16974, EBITDA: 13646},
{year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381},
{year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472},
{year: 2019, monthNumber: 2, rev: 12265, exp: 12752, profit: -487},
{year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469},
{year: 2018, monthNumber: 3, rev: 13657, exp: 13424, profit: 233},
{year: 2019, monthNumber: 3, rev: 9050, exp: 12410, profit: -3360},
{year: 2019, monthNumber: 3, rev: 15045, exp: 13315, profit: 1730}
]
const add = (obj, type, year, month, value) => {
obj[type] = obj[type] || {}
obj[type][year] = obj[type][year] || []
obj[type][year][month] = (obj[type][year][month] || 0) + value
}
var result = data.reduce((obj, record) => {
const {
year,
monthNumber,
} = record
const ignore = ['year', 'monthNumber']
Object.keys(record).forEach(key => {
if (!ignore.includes(key)){
add(obj, key, year, monthNumber, record[key])
}
})
return obj
}, {}
);
console.log(result)
Vous pouvez adopter une approche dynamique et retirer year et monthNumber de l'objet pour le regroupement.
Plus tard, créez un tableau simple de l'objet.
.as-console-wrapper { max-height: 100% !important; top: 0; }
var data = [{ year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459 }, { year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849 }, { year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579 }, { year: 2019, monthNumber: 0, rev: 32354, exp: 11184, profit: 21170 }, { year: 2018, monthNumber: 1, rev: 30620, exp: 16974, profit: 13646 }, { year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381 }, { year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472 }, { year: 2019, monthNumber: 1, rev: 12265, exp: 12752, profit: -487 }, { year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469 }, { year: 2018, monthNumber: 2, rev: 13657, exp: 13424, profit: 233 }, { year: 2019, monthNumber: 2, rev: 9050, exp: 12410, profit: -3360 }, { year: 2019, monthNumber: 2, rev: 15045, exp: 13315, profit: 1730 }],
result = data.reduce((r, { year, monthNumber, ...o }) => {
Object.entries(o).forEach(([k, v]) => {
r[k] = r[k] || {};
r[k][year] = r[k][year] || [];
r[k][year][monthNumber] = (r[k][year][monthNumber] || 0) + v;
});
return r;
}, {}),
plain = Object.entries(result).reduce((r, [k, years]) => {
Object.entries(years).forEach(([year, array]) => array.forEach((v, monthNumber) => {
var temp = r.find(q => q.year === year && q.monthNumber === monthNumber);
if (!temp) r.push(temp = { year, monthNumber });
temp[k] = v;
}));
return r;
}, []);
console.log(result);
console.log(plain);
Bonjour, dans ce qui précède, où pouvons-nous inclure la somme des valeurs?
Où le voulez-vous?
Je veux d'abord additionner le rev, l'exp et le profit pour chaque année et mois
veuillez ajouter ces informations à la question dans le jeu de résultats.
data = data.reduce(function(total, currentValue){
let year = currentValue.year;
let monthNumber = currentValue.monthNumber;
if(!total.rev[year]){
total.rev[year] = [];
total.exp[year] = [];
total.profit[year] = [];
}
if(!total.rev[year][monthNumber]){
total.rev[year][monthNumber] = 0;
total.exp[year][monthNumber] = 0;
total.profit[year][monthNumber] = 0;
}
if(typeof currentValue.rev == "number") total.rev[year][monthNumber] += currentValue.rev;
if(typeof currentValue.exp == "number") total.exp[year][monthNumber] += currentValue.exp;
if(typeof currentValue.profit == "number") total.profit[year][monthNumber] += currentValue.profit;
return total;
}, {
rev : {},
exp : {},
profit : {}
});
vous pouvez parcourir toutes les valeurs et ajouter en fonction de l'année
var _data=[{year:2018,monthNumber:0,rev:40984,exp:15525,profit:25459},{year:2018,monthNumber:0,rev:162457,exp:53608,profit:108849},{year:2019,monthNumber:0,rev:8935,exp:12514,profit:-3579},{year:2019,monthNumber:0,rev:32354,exp:11184,profit:21170},{year:2018,monthNumber:1,rev:30620,exp:16974,profit:13646},{year:2018,monthNumber:1,rev:9050,exp:12431,profit:-3381},{year:2019,monthNumber:1,rev:9050,exp:12522,profit:-3472},{year:2019,monthNumber:1,rev:12265,exp:12752,profit:-487},{year:2018,monthNumber:2,rev:9955,exp:12424,profit:-2469},{year:2018,monthNumber:2,rev:13657,exp:13424,profit:233},{year:2019,monthNumber:2,rev:9050,exp:12410,profit:-3360},{year:2019,monthNumber:2,rev:15045,exp:13315,profit:1730}];
var _desired = {rev:{},exp:{},profit:{}}
_data.forEach(key=>{
if(!_desired.rev[key.year]){
_desired.rev[key.year] = [];
}
if(!_desired.exp[key.year]){
_desired.exp[key.year] = [];
}
if(!_desired.profit[key.year]){
_desired.profit[key.year] = [];
}
_desired.rev[key.year].push(key.rev);
_desired.exp[key.year].push(key.exp);
_desired.profit[key.year].push(key.profit);
})
console.log(_desired);
Essayez ceci, je ne sais pas que cela correspondra à votre objectif ou non:
let data = [
{year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459},
{year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849},
{year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579},
{year: 2019, monthNumber: 1, rev: 32354, exp: 11184, profit: 21170},
{year: 2018, monthNumber: 1, rev: 30620, exp: 16974, EBITDA: 13646},
{year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381},
{year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472},
{year: 2019, monthNumber: 2, rev: 12265, exp: 12752, profit: -487},
{year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469},
{year: 2018, monthNumber: 3, rev: 13657, exp: 13424, profit: 233},
{year: 2019, monthNumber: 3, rev: 9050, exp: 12410, profit: -3360},
{year: 2019, monthNumber: 3, rev: 15045, exp: 13315, profit: 1730}
]
var result={};
function simplearray(obj){
//alert(obj.year);
if(typeof result[obj.year]== "undefined")
{
result[obj.year]={};
}
if(typeof result[obj.year][obj.monthNumber]== "undefined")
{
result[obj.year][obj.monthNumber]={};
}
if(typeof result[obj.year][obj.monthNumber]["rev"]== "undefined")
{
result[obj.year][obj.monthNumber]["rev"]=0;
result[obj.year][obj.monthNumber]["exp"]=0;
result[obj.year][obj.monthNumber]["profit"]=0;
}
result[obj.year][obj.monthNumber]["rev"]+=obj.rev;
result[obj.year][obj.monthNumber]["exp"]+=obj.exp;
result[obj.year][obj.monthNumber]["profit"]+=obj.profit;
}
for (a=0;a<data.length;a++)
{
simplearray(data[a]);
}
console.log(result);
console.log(result[2018][2].rev);
La deuxième façon, si le monthNumber est bien indexé:
let data = [
{year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459},
{year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849},
{year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579},
{year: 2019, monthNumber: 0, rev: 32354, exp: 11184, profit: 21170},
{year: 2018, monthNumber: 1, rev: 30620, exp: 16974, profit: 13646},
{year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381},
{year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472},
{year: 2019, monthNumber: 1, rev: 12265, exp: 12752, profit: -487},
{year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469},
{year: 2018, monthNumber: 2, rev: 13657, exp: 13424, profit: 233},
{year: 2019, monthNumber: 2, rev: 9050, exp: 12410, profit: -3360},
{year: 2019, monthNumber: 2, rev: 15045, exp: 13315, profit: 1730}
]
var result={};
function simplearray(obj){
if(typeof result["rev"]== "undefined")
{
result["rev"]={};
}
if(typeof result["rev"][obj.year]== "undefined")
{
result["rev"][obj.year]=[];
}
if(typeof result["rev"][obj.year][obj.monthNumber]== "undefined")
{
result["rev"][obj.year][obj.monthNumber]=0;
}
result["rev"][obj.year][obj.monthNumber]+=obj.rev;
if(typeof result["exp"]== "undefined")
{
result["exp"]={};
}
if(typeof result["exp"][obj.year]== "undefined")
{
result["exp"][obj.year]=[];
}
if(typeof result["exp"][obj.year][obj.monthNumber]== "undefined")
{
result["exp"][obj.year][obj.monthNumber]=0;
}
result["exp"][obj.year][obj.monthNumber]+=obj.exp;
if(typeof result["profit"]== "undefined")
{
result["profit"]={};
}
if(typeof result["profit"][obj.year]== "undefined")
{
result["profit"][obj.year]=[];
}
if(typeof result["profit"][obj.year][obj.monthNumber]== "undefined")
{
result["profit"][obj.year][obj.monthNumber]=0;
}
result["profit"][obj.year][obj.monthNumber]+=obj.profit;
}
for (a=0;a<data.length;a++)
{
simplearray(data[a]);
}
console.log(result);
console.log(result["profit"][2018][0]);
Alors qu'avez-vous essayé?
FYI: Votre sortie est en fait incorrecte.
Honnêtement, tout ce que j'ai essayé est trop compliqué et est arrivé à des impasses, de réduire et puis pour chaque. J'espère que vous pourrez m'orienter dans la bonne direction.
qu'est-ce que la propriété
EBITDA?reductionitère une structure de liste traitant une fonction sur chaque élément de liste, il itère. Si l'on sait que le premier argument de cette fonction fonctionne le mieux en tant qu'objet d'accumulation si c'est aussi la valeur de retour même de cette fonction alors que le deuxième argument de cette fonction est l'élément de liste, on peut maintenant proposer un processus générique qui peut à peu près réduire toute structure de données répertoriée. Alors, quelle a été votre approche génétique?@NinaScholz ajusté
MISE À JOUR: un peu corrigé avec les valeurs de monthNumber
avez-vous besoin maintenant du résultat intermédiaire?