Skip to content

Commit e18d8e0

Browse files
committed
Sort parties based on name, votes or mandates
1 parent 80184c7 commit e18d8e0

File tree

2 files changed

+41
-15
lines changed

2 files changed

+41
-15
lines changed

index.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ <h1>Valgsimulator</h1>
5252
<fieldset>
5353
<legend>Visningsalternativer</legend>
5454
<p>Påvirker <strong>ikke</strong> beregningen av valgresultatet, men kun visningen av tabellene.</p>
55+
<span>
56+
<label for="sortparties">Sortér partier etter</label>
57+
<select id="sortparties" oninput="update();">
58+
<option>Navn</option>
59+
<option>Stemmer</option>
60+
<option>Mandater</option>
61+
</select>
62+
</span>
5563
<span>
5664
<input type="checkbox" id="showfraction" oninput="update();"/>
5765
<label for="showfraction">Vis andeler rundet <strong>ned</strong> til</label>

valg.js

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ function roundDown(number, decimals) {
88
return number.toFixed(decimals);
99
};
1010

11-
function printTable(table, data, mergeParties, mergeDistricts, mergedDistrictLabel, showFraction, showColumnTotals, showRowTotals, decimals) {
11+
function printTable(table, data, parties, mergeParties, mergeDistricts, mergedDistrictLabel, showFraction, showColumnTotals, showRowTotals, decimals) {
1212
if (mergeParties.length > 0) {
1313
var newData = {};
1414
for (var district in data) {
@@ -21,7 +21,13 @@ function printTable(table, data, mergeParties, mergeDistricts, mergedDistrictLab
2121
}
2222
}
2323
}
24-
return printTable(table, newData, [], mergeDistricts, mergedDistrictLabel, showFraction, showColumnTotals, showRowTotals, decimals);
24+
for (var party of mergeParties) {
25+
if (parties.includes(party)) {
26+
parties.splice(parties.indexOf(party), 1); // remove from list of sorted parties
27+
}
28+
}
29+
parties.push("ANDRE"); // always last
30+
return printTable(table, newData, parties, [], mergeDistricts, mergedDistrictLabel, showFraction, showColumnTotals, showRowTotals, decimals);
2531
} else if (mergeDistricts.length > 0) {
2632
var newData = {};
2733
newData[mergedDistrictLabel] = {};
@@ -37,20 +43,11 @@ function printTable(table, data, mergeParties, mergeDistricts, mergedDistrictLab
3743
newData[district] = data[district];
3844
}
3945
}
40-
return printTable(table, newData, mergeParties, [], mergedDistrictLabel, showFraction, showColumnTotals, showRowTotals, decimals);
46+
return printTable(table, newData, parties, mergeParties, [], mergedDistrictLabel, showFraction, showColumnTotals, showRowTotals, decimals);
4147
}
4248

43-
// Build ordered list of unique parties
44-
var parties = [];
45-
for (var district in data) {
46-
for (var party in data[district]) {
47-
if (!parties.includes(party)) {
48-
parties.push(party);
49-
}
50-
}
51-
}
49+
// Make ANDRE always appear last
5250
if (parties.includes("ANDRE")) {
53-
// Make ANDRE always appear last
5451
parties.splice(parties.indexOf("ANDRE"), 1);
5552
parties.push("ANDRE");
5653
}
@@ -323,8 +320,29 @@ function update() {
323320
var showFraction = document.getElementById("showfraction").checked;
324321
var decimals = parseInt(document.getElementById("decimals").value);
325322

326-
printTable(voteTable, votes, mergeParties, mergeDistricts, "Distriktsstemmer", showFraction, true, true, decimals);
327-
printTable(seatTable, seats, mergeParties, mergeDistricts, "Distriktsmandater", showFraction, true, true, decimals);
323+
// Build sorted list of unique parties
324+
var sortParties = document.getElementById("sortparties").value;
325+
var parties = [];
326+
for (var district in votes) {
327+
for (var party in votes[district]) {
328+
if (!parties.includes(party)) {
329+
parties.push(party);
330+
}
331+
}
332+
}
333+
var compare = (party1, party2, data) => data[party2] == data[party1] ? (party1 < party2 ? -1 : +1) : (data[party2] - data[party1]); // sort by value in "data", but by name if values are equal
334+
if (sortParties == "Navn") {
335+
parties.sort();
336+
} else if (sortParties == "Stemmer") {
337+
var globalVotes = sumLocal(votes);
338+
parties.sort((party1, party2) => compare(party1, party2, globalVotes));
339+
} else if (sortParties == "Mandater") {
340+
var globalSeats = sumLocal(seats);
341+
parties.sort((party1, party2) => compare(party1, party2, globalSeats));
342+
}
343+
344+
printTable(voteTable, votes, parties, mergeParties, mergeDistricts, "Distriktsstemmer", showFraction, true, true, decimals);
345+
printTable(seatTable, seats, parties, mergeParties, mergeDistricts, "Distriktsmandater", showFraction, true, true, decimals);
328346
};
329347

330348
function showTables(showVotes, showSeats) {

0 commit comments

Comments
 (0)