Javascript 利用u.map和._groupBy用lodash重新构造阵列

Javascript 利用u.map和._groupBy用lodash重新构造阵列,javascript,arrays,lodash,Javascript,Arrays,Lodash,我希望用lodash重新构造一组对象 我一直在尝试改编许多在网上找到的例子,但没有任何运气。似乎我必须使用.map和\u groupBy的组合,但我真的不能完全理解这一点 感谢您的帮助 初始数组: const条目=[ { 年份:2019年, 儿童:[ {名称:'red',金额:1,标签:'color'}, {名称:'黄色',金额:20,标签:'颜色'}, {名称:'绿色',数量:12,标签:'颜色'}, ], }, { 年份:“2020年”, 儿童:[ {名称:'red',金额:1,标签:'co

我希望用lodash重新构造一组对象

我一直在尝试改编许多在网上找到的例子,但没有任何运气。似乎我必须使用
.map
\u groupBy
的组合,但我真的不能完全理解这一点

感谢您的帮助

初始数组

const条目=[
{
年份:2019年,
儿童:[
{名称:'red',金额:1,标签:'color'},
{名称:'黄色',金额:20,标签:'颜色'},
{名称:'绿色',数量:12,标签:'颜色'},
],
},
{
年份:“2020年”,
儿童:[
{名称:'red',金额:1,标签:'color'},
{名称:“黄色”,数量:3,标签:“颜色”},
],
},
]
重组阵列

[
{
id:'红色',
数据:[
{年份:'2019',金额:1},
{年份:'2020',金额:1},
],
},
{
id:'黄色',
数据:[
{年份:'2019',金额:20},
{年份:'2020',金额:3},
],
},
{
id:'绿色',
数据:[
{年份:'2019',金额:12},
],
},
]

可能有很多不同的方法,但是,我发现最好的方法是:

  • 将子对象展平为一个数组
  • 使用u.groupBy创建键入名称的这些条目的映射
  • 使用u.entries获取映射的键和值数组
  • 最后,使用u.map将这些条目转换为所需的输出
  • const条目=[
    {
    年份:2019年,
    儿童:[
    {名称:'red',金额:1,标签:'color'},
    {名称:'黄色',金额:20,标签:'颜色'},
    {名称:'绿色',数量:12,标签:'颜色'},
    ],
    },
    {
    年份:“2020年”,
    儿童:[
    {名称:'red',金额:1,标签:'color'},
    {名称:“黄色”,数量:3,标签:“颜色”},
    ],
    },
    ]
    //第一步
    让flattedChildren=uuz.flatMap(条目,e=>e.children.map(c=>{return{……c,year:e.year}));
    //步骤2
    让entryMap=u.groupBy(flattedChildren,“name”);
    //步骤3
    让mapEntries=\ u0.entries(entryMap);
    //步骤4
    让result=..map(mapEntries,([id,items])=>{return{id,data:items.map(item=>.[uu.pick(item,[“amount”,“year”]))});
    日志(“结果:”,结果);
    

    您可以使用
    flatMap
    groupBy
    和映射链接整个操作

    const entries=[{year:'2019',children:[{name:'red',amount:1,label:'color'},{name:'year:'green',amount:12,label:'color'},{year:'2020',children:[{name:'red amount 1,label:'color'},{name:'year:'year',amount 3,label:'color'}],
    结果=(条目)
    .flatMap({year,children})=>{.map(children,{name:id,amount})=>({year,id,amount})))
    .groupBy('id'))
    .map((数据,id)=>({id,数据:}.map(数据,({year,amount})=>({year,amount})))
    .value();
    控制台日志(结果)
    
    。作为控制台包装{最大高度:100%!重要;顶部:0;}