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

标签 javascript arrays sorting object

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

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

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

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

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

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

最佳答案

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

稍后平整所有组。

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

关于javascript - 如何从排序中排除/跳过项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53683359/

相关文章:

javascript - 排序时保留 JSON 数组

javascript - 在innerHTML中调用javascript函数

javascript - 多行问卷可编辑

javascript - 将此 javascript 对象从 jQuery 传递到 PHP?

sorting - 根据elasticsearch中数组的长度排序

java - 将分隔文件转换为树

javascript - 智能手机作为服务器

javascript - 年龄验证,确保不为空且不小于18

c - 如何在 C 中将十六进制转换为字节数组

c++ - for循环中的数组加法