I am trying to reformat year ranges where there are gaps and consolidate year ranges. E.G. [{start: 2002, end: 2020}, {start: 2020, end: null}] to {start: 2002, end: null} E.G. [{2002, 2004},{2006, 2008}, {2008, null}] to [{2002-2004}, {2006-null}]
Relates to politician's party memberships through an API, difficulties where they change parties or rejoin parties.
interface yearRange{
start: number
end: number
}
function checkYearGaps(yearRanges: any[]) {
let startYears: number[] = [];
let endYears: (number | null)[] = [];
let period: (number | null)[] = [];
for (let y of yearRanges) {
startYears.push(y.start);
endYears.push(y.end);
}
let matchedEndYears: (number | null)[] = [];
let unmatchedEndYears: (number | null)[] = [];
for (let e of endYears) {
const found = startYears.find((s) => s == e);
if (found) {
matchedEndYears.push(found);
} else if (!found) {
unmatchedEndYears.push(e);
}
}
if (unmatchedEndYears.length > 0) {
let start: number;
for (let e of unmatchedEndYears) {
let lesser: number[] = [];
if (e == null) {
if (startYears.length > 1) {
start = Math.min(...startYears);
} else {
start = startYears[0];
}
} else if (e != null) {
lesser = startYears.filter((s) => s < e);
start = Math.max(...lesser);
}
period.push({ start: start, end: e });
}
} else if (unmatchedEndYears.length == 0) {
let start: number = Math.min(...startYears);
let end: number | null;
if (endYears.includes(null)) {
end = null;
} else {
end = Math.max(...endYears);
}
period.push({ start: start, end: end });
}
console.log(period);
return period;
}