JavaScript将平面数组转换为嵌套/分组和排序数组

JavaScript将平面数组转换为嵌套/分组和排序数组,javascript,arrays,object,ecmascript-6,transform,Javascript,Arrays,Object,Ecmascript 6,Transform,我试图将对象数组转换为JavaScript中的“分组”和排序输出数组,最好是ES6方式(例如使用.map,.reduce,等等) 总结: 对象数组 每个对象都是一个“项”:a1、a2、b1、b2 每个对象都有一个类似于组/类别的“section”属性 所需的输出数组应返回按“节”分组的项对象 节和项的输出数组的排序顺序也在属性中定义 我看到了一个例子,它让我走上了正确的方向,但并不完全达到所需的输出,也没有考虑排序顺序: const result = data.reduce((accum,

我试图将对象数组转换为JavaScript中的“分组”和排序输出数组,最好是ES6方式(例如使用
.map
.reduce
,等等)

总结:

  • 对象数组
  • 每个对象都是一个“项”:a1、a2、b1、b2
  • 每个对象都有一个类似于组/类别的“section”属性
  • 所需的输出数组应返回按“节”分组的项对象
  • 节和项的输出数组的排序顺序也在属性中定义
我看到了一个例子,它让我走上了正确的方向,但并不完全达到所需的输出,也没有考虑排序顺序:

const result = data.reduce((accum, currElm) => {
    const currSection = currElm['section'];
    accum[currSection] = (accum[currSection] || []).concat(currElm);
    return accum;
}, {});

您应该先对数据进行排序。
sort
函数如下所示

data.sort((a, b) => (a.section_order - b.section_order) || (a.item_order - b.item_order));
如您所见,我们将条件分为两部分:

  • (a.区段顺序-b.区段顺序)
  • (a.项目订单-b.项目订单)
  • 这意味着您可以排序
    部分的顺序
    ,然后按
    项目的顺序

    在此之后,您可以使用字典功能循环一次,如下所示

    const数据=[
    {节:'A',项:'a1',节顺序:2,项顺序:2},
    {节:'B',项:'b1',节顺序:1,项顺序:2},
    {节:'A',项:'a2',节顺序:2,项顺序:1},
    {节:'B',项:'b2',节顺序:1,项顺序:1}
    ];
    data.sort((a,b)=>(a.section_order-b.section_order)| |(a.item_order-b.item_order));
    var结果=[];
    对于(数据的var项){
    var节=item.section;
    如果(!result[section]){//if not exists=>create new
    结果[section]={section,items:[item]};
    }else{//if exists=>在项目中再添加一个项目
    结果[section].items.push(item);
    }
    }
    console.log(Object.values(result))
    
    data.sort((a, b) => (a.section_order - b.section_order) || (a.item_order - b.item_order));