JS把数组重新分组?

假设一个数组长这样

    var qq = [
          {
            "group": 100,
            "info": {"event": 123},
            "main": true,
          },
          {
            "group": 100,
            "info": {"event": 323},
            "main": false,
            "sp": 12
          },
          {
            "group": 103,
            "info": {"event": 123},
            "main": true,
            "sp": 13,
          },
          {
            "group": 103,
            "info": {"event": 323},
            "main": false,
            "sp": 10
          },
          {
            "group": 103,
            "info": {"event": 123},
            "main": false,
            "sp": 1
          }
          ];

group是同数字表示是一组的,
我想要把同一组的放在一起,
還有一個特殊情况,sp===1的话,就把它放到前一个阵列的最后一个位置

也就是最后输出要这样

    var qq = [
      
    
          [
              {
                "group": 100,
                "info": {"event": 123},
                "main": true,
              },
              {
                "group": 100,
                "info": {"event": 323},
                "main": false,
                "sp": 12
              },
               {
                "group": 103,
                "info": {"event": 123},
                "main": false,
                "sp": 1
              }
          ],
          [
              {
                "group": 103,
                "info": {"event": 123},
                "main": true,
                "sp": 13,
              },
              {
                "group": 103,
                "info": {"event": 323},
                "main": false,
                "sp": 10
              }
          ]
          ];

这样具体该怎么实现?

阅读 3.2k
2 个回答

试试这样如何?

var qq = [{
        "group": 100,
        "info": { "event": 123 },
        "main": true,
    },
    {
        "group": 100,
        "info": { "event": 323 },
        "main": false,
        "sp": 12
    },
    {
        "group": 103,
        "info": { "event": 123 },
        "main": true,
        "sp": 1,
    },
    {
        "group": 103,
        "info": { "event": 323 },
        "main": false,
        "sp": 10
    },
    {
        "group": 103,
        "info": { "event": 123 },
        "main": true,
        "sp": 1
    }
];
var list = [];
var isTargetSp = (x) => x === 1;

qq.forEach(x => {
    var index = list.findIndex(y => x.group === y[0].group);

    if (~index) {
        // 此处`list`已经有了该类型。
        
        // 如果是 sp === 1 的话,就推入上一层数组中
        index = isTargetSp(x.sp) ? index - 1 : index;
        list[index].push(x)
    } else {
        // 列表没有该类型(group 分类)

        // 如果 sp === 1,
        // 同时新数组不能是一个空数组(边界处理: 空数组无法推到上一个数组中去)
        var isTarget = isTargetSp(x.sp) && list.length;

        // 如果能满足我们的条件,那就推入上一个数组中。
        // 由于这个类型没有创建,因此会推入`list`列表中最后一项中。
        // 如果没有满足条件,那就创建一个新的类型。
        isTarget ? list[list.length - 1].push(x) : list.push([x]);
    }
})

lodash有个groupBy的方法, 你可以

_.groupBy(qq, item => item.group)

可以得到结构如下

![clipboard.png](/img/bVbm9PL)

剩下的处理应该很简单了。

如果要自己实现的话可以这样

let result = [];

for(let i=0; i<qq.length; i++) {
    let group = qq[i]['group'];
    let filterArr = qq.filter(item => item.group === group).sort((a,b) => b.sp - a.sp);
    result.push(filterArr);
    i += filterArr.length - 1;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏