为了账号安全,请及时绑定邮箱和手机立即绑定

按整数值排序后按特定顺序对对象进行排序

按整数值排序后按特定顺序对对象进行排序

慕森卡 2022-05-26 11:14:08
我目前正在尝试将一组对象排序为特定顺序。我目前按级别对其进行排序-效果很好,但是我需要按如下所示对其进行排序,其中“连接器”类型必须只能出现在“子句”类型之后和之前,如下所示:[  {    "type": "Clause",    "level": 1  },  {    "type": "Concatenator",    "level": 1  },  {    "type": "Clause",    "level": 2  },  {    "type": "Concatenator",    "level": 2  },  {    "type": "Clause",    "level": 2  },  {    "type": "Concatenator",    "level": 3  },  {    "type": "Clause",    "level": 3  },  {    "type": "Concatenator",    "level": 3  },  {    "type": "Clause",    "level": 3  },  {    "type": "Concatenator",    "level": 4  },  {    "type": "Clause",    "level": 4  },  {    "type": "Concatenator",    "level": 4  },  {    "type": "Clause",    "level": 4  }]下面是我目前拥有的代码,它目前仅按级别排序,并尝试按我想要的方式对其进行排序:conditionsArr = [{    "type": "Concatenator",    "level": 3  },  {    "type": "Clause",    "level": 4  },  {    "type": "Clause",    "level": 1  },  {    "type": "Concatenator",    "level": 1  },  {    "type": "Clause",    "level": 3  },  {    "type": "Clause",    "level": 4  },  {    "type": "Clause",    "level": 3  },  {    "type": "Concatenator",    "level": 4  },  {    "type": "Clause",    "level": 2  },  {    "type": "Concatenator",    "level": 2  },  {    "type": "Concatenator",    "level": 3  },  {    "type": "Clause",    "level": 2  },  {    "type": "Concatenator",    "level": 4  }]function sortByLevel(conditionsArr) {  return conditionsArr.sort(function(a, b) {    return a.level - b.level;  }).sort(function(a, b) {    if (a.type === b.type)      return -1;    return 0;  });}我尝试过另一种排序,并查看了其他答案以获取灵感,但我无法将其按排序后半部分所需的顺序排列。关于如何对它进行排序有什么建议吗?
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

你可以

  • 将对象分组level

  • level Clause为每个和Concatenator不同的数组收集

  • 通过迭代分组对象来重建一个新数组

  • 使用变量i来获得交替types

var array = [{ type: "Concatenator", level: 3 }, { type: "Clause", level: 4 }, { type: "Clause", level: 1 }, { type: "Concatenator", level: 1 }, { type: "Clause", level: 3 }, { type: "Clause", level: 4 }, { type: "Clause", level: 3 }, { type: "Concatenator", level: 4 }, { type: "Clause", level: 2 }, { type: "Concatenator", level: 2 }, { type: "Concatenator", level: 3 }, { type: "Clause", level: 2 }, { type: "Concatenator", level: 4 }],

    order = { Clause: 0, Concatenator: 1 },

    temp = array.reduce((r, o) => {

        r[o.level] = r[o.level] || [[], []];

        r[o.level][order[o.type]].push(o);

        return r;

    }, {}),

    i = 0,

    result = Object

        .keys(temp)

        .sort((a, b) => a - b)

        .flatMap(k => {

            var r = [];

            while (temp[k][i].length) {

                r.push(temp[k][i].shift());

                i = 1 - i;

            }

            return r;

        });


console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反对 回复 2022-05-26
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信