I need help applying a proper sorting algorithm for this. I'm trying to calculate a schedule for teams performing in a teamgym tournament.
The rules:
In short; the discipline.sortOrder must be in sequence (1), and one team should not perform in two consecutive disciplines (2).
(1) For each row in the array, the next sequence of discipline.sortOrder must be applied.
Example: If result[0].discipline.sortOrder === 0
, then result[1].discipline.sortOrder === 1
.
(2) Each row in the array must contain a different team than the previous row.
Example: If result[0].team.id === 1
, then result[1].team.id !== 1
What I have so far
var schedule = [
{ "team":{"id": 1, "name": "Haugesund-1"}, "discipline":{ "name":"Frittstående", "sortOrder":0 } },
{ "team":{"id": 1, "name": "Haugesund-1"}, "discipline":{ "name":"Trampett", "sortOrder":1 } },
{ "team":{"id": 1, "name": "Haugesund-1"}, "discipline":{ "name":"Tumbling", "sortOrder":2 } },
{ "team":{"id": 2, "name": "Sola-1"}, "discipline":{ "name":"Frittstående", "sortOrder":0 } },
{ "team":{"id": 2, "name": "Sola-1"}, "discipline":{ "name":"Trampett", "sortOrder":1 } },
{ "team":{"id": 2, "name": "Sola-1"}, "discipline":{ "name":"Tumbling", "sortOrder":2 } },
{ "team":{"id": 3, "name": "Stavanger-1"}, "discipline":{ "name":"Frittstående", "sortOrder":0 } },
{ "team":{"id": 3, "name": "Stavanger-1"}, "discipline":{ "name":"Trampett", "sortOrder":1 } },
{ "team":{"id": 3, "name": "Stavanger-1"}, "discipline":{ "name":"Tumbling", "sortOrder":2 } },
{ "team":{"id": 4, "name": "Ålgård"}, "discipline":{ "name":"Frittstående", "sortOrder":0 } },
{ "team":{"id": 4, "name": "Ålgård"}, "discipline":{ "name":"Trampett", "sortOrder":1 } },
{ "team":{"id": 4, "name": "Ålgård"}, "discipline":{ "name":"Tumbling", "sortOrder":2 } }
];
var sorted = schedule.sort((a, b) => {
// Sort by team (This is wrong!!)
if (a.team.id != b.team.id) return a.team.id < b.team.id ? -1 : 1;
// Sort by discipline
const aDis = a.discipline.sortOrder;
const bDis = b.discipline.sortOrder;
if (aDis != bDis) { return aDis < bDis ? -1 : 1; }
return 0;
});
// Write out result
document.querySelector('#result').innerText = sorted.map(s => JSON.stringify(s)).join('\n');
<h1>Result</h1>
<pre id="result"></pre>
I find it hard to dictate the order of things when b
is not necessarily the next nor previous in sequence. This sort will create an order which is equal to the original
. This is not the result I was looking for.
RESULT This is what I would like to end up with:
var result = [
{ "team":{"id": 1, "name": "Haugesund-1"}, "discipline":{ "name":"Frittstående", "sortOrder":0 } },
{ "team":{"id": 2, "name": "Sola-1"}, "discipline":{ "name":"Trampett", "sortOrder":1 } },
{ "team":{"id": 3, "name": "Stavanger-1"}, "discipline":{ "name":"Tumbling", "sortOrder":2 } },
{ "team":{"id": 2, "name": "Sola-1"}, "discipline":{ "name":"Frittstående", "sortOrder":0 } },
{ "team":{"id": 1, "name": "Haugesund-1"}, "discipline":{ "name":"Trampett", "sortOrder":1 } },
{ "team":{"id": 4, "name": "Ålgård"}, "discipline":{ "name":"Tumbling", "sortOrder":2 } },
{ "team":{"id": 3, "name": "Stavanger-1"}, "discipline":{ "name":"Frittstående", "sortOrder":0 } },
{ "team":{"id": 4, "name": "Ålgård"}, "discipline":{ "name":"Trampett", "sortOrder":1 } },
{ "team":{"id": 1, "name": "Haugesund-1"}, "discipline":{ "name":"Tumbling", "sortOrder":2 } },
{ "team":{"id": 4, "name": "Ålgård"}, "discipline":{ "name":"Frittstående", "sortOrder":0 } },
{ "team":{"id": 3, "name": "Stavanger-1"}, "discipline":{ "name":"Trampett", "sortOrder":1 } },
{ "team":{"id": 2, "name": "Sola-1"}, "discipline":{ "name":"Tumbling", "sortOrder":2 } }
]
Is this even possible to do using .sort
?