有一个对象数组,我需要对其进行排序。它看起来像这样:
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/