Как исключить / пропустить элементы из сортировки? - PullRequest
0 голосов
/ 08 декабря 2018

Есть массив объектов, которые мне нужно отсортировать.Это выглядит так:

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'}
];

Я хочу отсортировать его по left (в основном) и top (во-вторых).Моя функция сортировки выглядит следующим образом:

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"}
];

Функция сортировки работает почти так, как я хотел, но было бы лучше, если бы она также учитывала group , если в одной группе более одного элемента.

Другими словами, я хочу, чтобы конечный результат выглядел следующим образом:

[
    {left: 15, top: 15, group: "groupThree"},
    {left: 25, top: 30, 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: 30, top: 30, group: "groupSix"}
    {left: 28, top: 25, group: "groupFive"},
];

Элементы из одной группы "держаться вместе.Есть идеи?

1 Ответ

0 голосов
/ 08 декабря 2018

Вы можете сгруппировать элементы и отсортировать сгруппированные элементы, а затем отсортировать по первому элементу сгруппированного элемента.

Позже выровняйте все группы.

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...