有一个对象数组,我需要对其进行排序。看起来像这样:
[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"}
];
同一组中的项目“粘在一起”。 有什么想法吗?
答案 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; }