Javascript 按键减少数组对象并返回嵌套对象

Javascript 按键减少数组对象并返回嵌套对象,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组 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:

我有一个对象数组

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}
]
我们的目标是首先根据年份和月份数将所有键值动态相加到一个数组中

原始数组只是一个示例,除了“exp”、“profit”等之外,还有多个附加键。我想让它成为动态的,避免提及每个键

[
    {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}
]
然后获得以下所需输出:

{ 
    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],
    }
}

您应该签出(可单独下载)并使用组功能。它根据给定的属性对数组进行分组。由于您没有发布任何代码,我相信您正在寻找lib。

您应该签出(可作为单机下载)并使用group函数。它根据给定的属性对数组进行分组。由于您没有发布任何代码,我相信您正在寻找库。

使用
减少
并将它们相加。编辑,添加了不知道关键点是什么的功能

let数据=[
{年份:2018,月数:0,版本:40984,实验:15525,利润:25459},
{年份:2018,月数:0,版本:162457,实验:53608,利润:108849},
{年份:2019,月数:0,版本:8935,实验:12514,利润:-3579},
{年份:2019,月号:1,版次:32354,实验:11184,利润:21170},
{年份:2018,月数:1,版本:30620,预期:16974,息税折旧摊销前利润:13646},
{年份:2018,月号:1,版本:9050,实验:12431,利润:-3381},
{年份:2019,月号:1,版次:9050,实验:12522,利润:-3472},
{年份:2019,月数:2,版次:12265,实验:12752,利润:-487},
{年份:2018,月号:2,版次:9955,实验:12424,利润:-2469},
{年份:2018,月数:3,版次:13657,实验:13424,利润:233},
{年份:2019,月数:3,版本:9050,实验:12410,利润:-3360},
{年份:2019,月数:3,版次:15045,实验:13315,利润:1730}
]
常量添加=(对象、类型、年、月、值)=>{
obj[type]=obj[type]| |{}
obj[类型][年]=obj[类型][年]| |[]
对象[类型][年][月]=(对象[类型][年][月]| 0)+值
}
var结果=数据减少((obj,记录)=>{
常数{
年,
蒙纳姆,
}=记录
常量忽略=['year','monthNumber']
Object.key(记录).forEach(key=>{
如果(!ignore.includes(键)){
添加(对象、键、年、月号、记录[键])
}
})
返回obj
}, {}
);

console.log(结果)
使用
reduce
并将它们相加。编辑,添加了不知道关键点是什么的功能

let数据=[
{年份:2018,月数:0,版本:40984,实验:15525,利润:25459},
{年份:2018,月数:0,版本:162457,实验:53608,利润:108849},
{年份:2019,月数:0,版本:8935,实验:12514,利润:-3579},
{年份:2019,月号:1,版次:32354,实验:11184,利润:21170},
{年份:2018,月数:1,版本:30620,预期:16974,息税折旧摊销前利润:13646},
{年份:2018,月号:1,版本:9050,实验:12431,利润:-3381},
{年份:2019,月号:1,版次:9050,实验:12522,利润:-3472},
{年份:2019,月数:2,版次:12265,实验:12752,利润:-487},
{年份:2018,月号:2,版次:9955,实验:12424,利润:-2469},
{年份:2018,月数:3,版次:13657,实验:13424,利润:233},
{年份:2019,月数:3,版本:9050,实验:12410,利润:-3360},
{年份:2019,月数:3,版次:15045,实验:13315,利润:1730}
]
常量添加=(对象、类型、年、月、值)=>{
obj[type]=obj[type]| |{}
obj[类型][年]=obj[类型][年]| |[]
对象[类型][年][月]=(对象[类型][年][月]| 0)+值
}
var结果=数据减少((obj,记录)=>{
常数{
年,
蒙纳姆,
}=记录
常量忽略=['year','monthNumber']
Object.key(记录).forEach(key=>{
如果(!ignore.includes(键)){
添加(对象、键、年、月号、记录[键])
}
})
返回obj
}, {}
);

console.log(result)
您可以采取动态方法,从对象中取出
月号
,进行分组

稍后从对象创建一个
plain
数组

var数据=[{年:2018,月数:0,版本:40984,实验:15525,利润:25459},{年:2018,月数:0,版本:162457,实验:53608,利润:108849},{年:2019,月数:0,版本:8935,实验:12514,利润:3579},{年:2019,月数:0,版本:32354,实验:11184,利润:21170},{年:2018年,月数:1,版次:30620,实验次数:16974,利润:13646},{年:2018年,月数:1,版次:9050,实验次数:12431,利润:-3381},{年:2019年,月数:1,版次:9050,实验次数:12522,利润:-3472},{年:2019年,月数:1,版次:12265,实验次数:12752,利润:-487},{年:2018年,月数:2,版次:9955,实验次数:12424,利润:-2469},{年份:2018年,月数:2,版本:13657,实验:13424,利润:233},{年份:2019年,月数:2,版本:9050,实验:12410,利润:-3360},{年份:2019年,月数:2,版本:15045,实验:13315,利润:1730},
结果=数据.reduce((r,{年,月数,…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;
});
返回r;
}, {}),
普通=对象。条目(结果)。减少((r,[k,年])=>{
Object.entries(years).forEach([year,array])=>array.forEach((v,monthNumber)=>{
var temp=r.find(q=>q.year==year&&q.monthNumber===monthNumber);
如果(!temp)r.push(temp={year,monthNumber});
温度[k]=v;
}));
返回r;
}, []);
控制台日志(结果);
console.log(普通);

.as console wrapper{max height:100%!important;top:0;}
您可以采用动态方法,将
年份
月号
从对象中取出进行分组

稍后从对象创建一个
plain
数组

var数据=[{年份:2
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 : {}
});