如何从排序中排除/跳过项目?

时间:2018-12-08 14:11:52

标签: javascript arrays sorting object

有一个对象数组,我需要对其进行排序。看起来像这样:

[Sat Dec 08 12:49:50.082687 2018] [:error] [pid 3996] [remote 37.37.41.199:176] mod_wsgi (pid=3996): Exception occurred processing WSGI script '/opt/python/current/app/application.py'.
[Sat Dec 08 12:49:50.082780 2018] [:error] [pid 3996] [remote 37.37.41.199:176] Traceback (most recent call last):
[Sat Dec 08 12:49:50.082805 2018] [:error] [pid 3996] [remote 37.37.41.199:176]   File "/opt/python/current/app/application.py", line 10, in <module>
[Sat Dec 08 12:49:50.082808 2018] [:error] [pid 3996] [remote 37.37.41.199:176]     from KoreD import app ##### Main Project Package ######
[Sat Dec 08 12:49:50.082814 2018] [:error] [pid 3996] [remote 37.37.41.199:176]   File "/opt/python/current/app/KoreD/__init__.py", line 4, in <module>
[Sat Dec 08 12:49:50.082816 2018] [:error] [pid 3996] [remote 37.37.41.199:176]     from flask import Flask
[Sat Dec 08 12:49:50.082830 2018] [:error] [pid 3996] [remote 37.37.41.199:176] ModuleNotFoundError: No module named 'flask'

我想按(主要)和顶部(第二)对其进行排序。我的排序功能如下:

var array = [
    {left: 20, top: 50, group: 'groupOne'},
    {left: 18, top: 10, group: 'groupTwo'},
    {left: 15, top: 15, group: 'groupThree'},
    {left: 25, top: 30, group: 'groupThree'},
    {left: 18, top: 25, group: 'groupFour'},
    {left: 28, top: 25, group: 'groupFive'},
    {left: 25, top: 15, group: 'groupSix'},
    {left: 30, top: 30, group: 'groupSix'}
];

结果是:

array.sort((x, y) => {
    return x.left - y.left || x.top - y.top;
});

排序功能几乎完全符合我的要求,但如果同时考虑(如果同一组中有多个项目)会更好。

换句话说,我希望最终结果如下所示:

[
    {left: 15, top: 15, group: "groupThree"},
    {left: 18, top: 10, group: "groupTwo"},
    {left: 18, top: 25, group: "groupFour"},
    {left: 20, top: 50, group: "groupOne"},
    {left: 25, top: 15, group: "groupSix"},
    {left: 25, top: 30, group: "groupThree"},
    {left: 28, top: 25, group: "groupFive"},
    {left: 30, top: 30, group: "groupSix"}
];

同一组中的项目“粘在一起”。 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以对项目进行分组并对已分组的项目进行排序,然后按已分组项目的第一个元素进行排序。

以后将所有组放平。

var array = [{ left: 20, top: 50, group: 'groupOne' }, { left: 18, top: 10, group: 'groupTwo' }, { left: 15, top: 15, group: 'groupThree' }, { left: 25, top: 30, group: 'groupThree' }, { left: 18, top: 25, group: 'groupFour' }, { left: 28, top: 25, group: 'groupFive' }, { left: 25, top: 15, group: 'groupSix' }, { left: 30, top: 30, group: 'groupSix' }],
    leftTop = (a, b) => a.left - b.left || a.top - b.top,
    sorted = Array
        .from(
            array
                .reduce((m, o) => m.set(o.group, (m.get(o.group) || []).concat(o)), new Map)
                .values(),
            a => a.sort(leftTop)
        )
        .sort(([a], [b]) => leftTop(a, b))
        .reduce((a, b) => a.concat(b));

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