Javascript 重新构造对象数组,然后对对象进行分组

Javascript 重新构造对象数组,然后对对象进行分组,javascript,arrays,object,ecmascript-6,reduce,Javascript,Arrays,Object,Ecmascript 6,Reduce,所以我找到了一个解决方案,但我仍在学习,觉得我的解决方案太长了。它没有使用所有ES6,可能会更好。我希望得到任何反馈和/或建议 数据如下所示: const formattedWorkbook = [ { "year": 2016, "mainHeaderEnglish": "Pearls of Wisdom", "categor

所以我找到了一个解决方案,但我仍在学习,觉得我的解决方案太长了。它没有使用所有ES6,可能会更好。我希望得到任何反馈和/或建议

数据如下所示:

const formattedWorkbook = 
     [
        {
            "year": 2016,
            "mainHeaderEnglish": "Pearls of Wisdom",
            "categoryCode": 3,
        },
        {
            "year": 2017,
            "mainHeaderEnglish": "VENuS Satellite",
            "categoryCode": 2,
        },
        {
            "year": 2017,
            "mainHeaderEnglish": "Hope for millions",
            "categoryCode": 1,
        },
        {
            "year": 2012,
            "mainHeaderEnglish": "green electricity Pioneer",
            "categoryCode": 2
        }
    ]
const formattedWorkbook = 
     [
        {
            "year": 2016,
            "value: [
               {"mainHeaderEnglish": "Pearls of Wisdom", "categoryCode": 3,}
             ]
        },
        {
            "year": 2017,
            "value":[
              {"mainHeaderEnglish": "VENuS Satellite", "categoryCode": 2},
              {"mainHeaderEnglish": "Hope for millions", "categoryCode": 1}
            ]
        },
        {
            "year": 2012,
            "value": [
              {"mainHeaderEnglish": "green electricity Pioneer", "categoryCode": 2}
            ]
        }
    ]
数据需要如下所示:

const formattedWorkbook = 
     [
        {
            "year": 2016,
            "mainHeaderEnglish": "Pearls of Wisdom",
            "categoryCode": 3,
        },
        {
            "year": 2017,
            "mainHeaderEnglish": "VENuS Satellite",
            "categoryCode": 2,
        },
        {
            "year": 2017,
            "mainHeaderEnglish": "Hope for millions",
            "categoryCode": 1,
        },
        {
            "year": 2012,
            "mainHeaderEnglish": "green electricity Pioneer",
            "categoryCode": 2
        }
    ]
const formattedWorkbook = 
     [
        {
            "year": 2016,
            "value: [
               {"mainHeaderEnglish": "Pearls of Wisdom", "categoryCode": 3,}
             ]
        },
        {
            "year": 2017,
            "value":[
              {"mainHeaderEnglish": "VENuS Satellite", "categoryCode": 2},
              {"mainHeaderEnglish": "Hope for millions", "categoryCode": 1}
            ]
        },
        {
            "year": 2012,
            "value": [
              {"mainHeaderEnglish": "green electricity Pioneer", "categoryCode": 2}
            ]
        }
    ]
这是我的有效解决方案,但我认为可能会更好:

let transformedWorkbook = formattedWorkbook.map(function (obj) {
    const result = {
        year: obj.year,
        value: []
    }

    for (let year in obj) {
        if (obj.hasOwnProperty(year) && year !== "year") {
            result.value.push({ [year]: obj[year] });
        }
    }

    result.value = [Object.assign({}, ...result.value)]
    return result;
});

const newWorkbook = new Map(transformedWorkbook.map(({ year, value }) => [year, { year, value: [] }]));

for (let { year, value } of transformedWorkbook) {
    newWorkbook.get(year).value.push(...[value].flat())
};

console.log([...newWorkbook.values()]);
您可以使用来根据
年份对阵列数据进行分组

const formatted工作簿=
[
{
“年份”:2016年,
“主流英语”:“智慧之珠”,
“类别代码”:3,
},
{
“年份”:2017年,
“主脑英语”:“金星卫星”,
“类别代码”:2,
},
{
“年份”:2017年,
“主流英语”:“百万人的希望”,
“类别代码”:1,
},
{
“年份”:2012年,
“主流英语”:“绿色电力先锋”,
“类别代码”:2
}
]
让结果=格式化工作簿。减少((acc,cur)=>{
让{year,…rest}=cur;
设ex=acc.find(x=>x.year==year);
如果(!ex){
ex={年,值:[]};
加速推力(ex);
}
ex.value.push(剩余);
返回acc;
}, [])

控制台日志(结果)
您仍然可以使用
映射
,但从对象中取出
年份
,并使用分组结果映射新对象

分块:

  • 获取一个iterable(如或),其中实现了一个映射函数,并返回一个数组

  • 要获得分组数据集,可以使用累加器(如
    Map
    的一个实例)对给定的对象数组进行迭代

    要从对象获取属性并保留其余属性

    { year, ...o }
    
    你可以拿一张
    年的
    ,然后得到一张支票。现在您有两个部分,用于分组的所需属性和作为值收集的其余部分

    从实例中获取一个值并存储该值

    如果没有获取数组作为值,则需要使用默认值

    m.get(year) || []
    
    with,返回第一个值,与数组类似,但不返回未定义的

    此值将与实际对象一起放入新数组中

    [...(m.get(year) || []), o]
    
    作为
    映射的新值

  • 最后是
    Array.from的映射函数

    ([year, value]) => ({ year, value })
    
    对给定的
    Map
    的键和值进行解构,并生成具有新结果的新对象

const formattedWorkbook=[{年份:2016,主要英语:“智慧之珠”,类别代码:3},{年份:2017,主要英语:“金星卫星”,类别代码:2},{年份:2017,主要英语:“百万希望”,类别代码:1},{年份:2012,主要英语:“绿色电力先锋”,类别代码:2},
结果=Array.from(
格式化工作簿.reduce((m,{year,…o})=>
m、 设置(年份,[…(m.get(year)| |[]),o]),新地图,
([year,value])=>({year,value})
);
控制台日志(结果)
.as控制台包装{max height:100%!important;top:0;}
您可以使用:

_.map(formattedWorkbook, el => {
  return {
    year: el.year,
      value: {
        mainHeaderEnglish: el.mainHeaderEnglish,
        categoryCode: el.categoryCode
      }
  }
});
如果您更喜欢本机javascript函数:

formattedWorkbook.map(el => {
  return {
    year: el.year,
      value: {
        mainHeaderEnglish: el.mainHeaderEnglish,
        categoryCode: el.categoryCode
      }
  }
});

真的很短很优雅,但我非常激动你太棒了,谢谢你花时间写出来。这不是我要求的输出,年份需要分组,同一年的值应该放在对象内的值数组中