src = {
let src = [
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 1997,
Value: 15.540540540540499
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 1998,
Value: 15.540540540540499
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 1999,
Value: 22.4489795918367
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2003,
Value: 25.3333333333333
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2004,
Value: 24.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2005,
Value: 24.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2006,
Value: 24.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2007,
Value: 26.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2009,
Value: 27.3333333333333
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2010,
Value: 24.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2011,
Value: 24.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2012,
Value: 24.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2013,
Value: 26
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2014,
Value: 26
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2015,
Value: 26.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2016,
Value: 28.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2017,
Value: 28.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2018,
Value: 28.6666666666667
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2019,
Value: 30.463576158940398
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2020,
Value: 30.463576158940398
},
{
Region: "East Asia & Pacific",
Name: "Australia",
Year: 2021,
Value: 31.125827814569501
}
].map(function (o, i) {
o.idx = i;
return o;
});
// Figure out the range of years.
let [min_year, max_year] = d3.extent(src, (d) => d.Year);
let years = d3.range(min_year, max_year + 1);
// Set up a Map to efficiently access the data by year
let data_map = d3.group(src, (o) => o.Year);
// Now, we'll iterate over the full range of years.
// When we find that a year is missing, we'll insert
// a simple object for that year with a null value.
// While we're at it, we'll parse the years to dates
// so we can add a proper time-scaled axis.
// We'll also mark any points adjacent to missing
// data as endpoints.
src = years.map(function (y) {
let d = data_map.get(y);
if (typeof d !== "undefined") {
d = d[0];
d.Year = d3.utcParse("%Y")(y);
return d;
} else {
let dm1 = data_map.get(y - 1);
if (dm1) {
dm1[0].endpoint = true;
}
let dp1 = data_map.get(y + 1);
if (dp1) {
dp1[0].endpoint = true;
}
return { Year: d3.utcParse("%Y")(y), Value: null };
}
});
return src;
}