function prepare()

in resources/charts/observable-plot.js [21:91]


function prepare() {
    /**
     * AirportInformation: { state, iata, name, city, country, latitude, longitude }
     * airports: Array<AirportInformation>
     * flights: Array<{ origin, destination, count }>
     */
    const { airports, flights } = parseAirportsInformation();
    /**
     * flightsByAirport: Map<iata: string, { origin: number, destination: number, total: number}>
     */
    const flightsByAirport = groupFlightsByAirports(flights);
    /**
     * byAirport: Map<iata: string, AirportInformation>
     */
    const byAirport = d3Array.index(airports, (d) => d.iata);

    /* Array<[state, AirportInformation[]]> */
    const airportsGroupedByStateArray = d3Array.groups(airports, (d) => d.state);

    /* DescSortedArray<[{ state: string, total: number, mostUsedAirportsInState: AirportInformation[] }]> */
    const stateInformationSortedArray = airportsGroupedByStateArray
        .map(([state, airportsInState]) => {
            const totalFlightsInState = d3Array.sum(airportsInState, ({ iata }) => flightsByAirport.get(iata)?.total);
            const sorted = d3Array.sort(airportsInState, ({ iata }) => -flightsByAirport.get(iata)?.total);
            const mostUsedAirportsInState = sorted.slice(0, airportCountPerGroup());
            return {
                state,
                total: totalFlightsInState,
                mostUsedAirports: mostUsedAirportsInState,
            };
        })
        .sort((stateA, stateB) => stateB.total - stateA.total);

    /* Array<state: string> */
    const stateSortedArray = stateInformationSortedArray.map(({ state }) => state);

    // Flatten the information in preparedData.stateInformationSortedArray, so that we
    // have one item == one airport information.
    /* Array<{state, iata, name, city, index, origin, destination, total}> */
    const plotData = stateInformationSortedArray.flatMap(({ mostUsedAirports, total, state }) => {
        const enrichedMostUsedAirports = mostUsedAirports.map(({ iata, name, city }, index) => ({
            state,
            iata,
            name,
            city,
            index, // This will be used to have consistent colors.
            ...flightsByAirport.get(iata),
        }));
        const otherTotal = total - d3Array.sum(mostUsedAirports, ({ iata }) => flightsByAirport.get(iata)?.total);

        if (otherTotal > 0) {
            enrichedMostUsedAirports.push({
                state,
                iata: "Other",
                total: otherTotal,
                index: enrichedMostUsedAirports.length,
            });
        }
        return enrichedMostUsedAirports;
    });

    preparedData = {
        airports,
        flights,
        flightsByAirport,
        byAirport,
        stateInformationSortedArray,
        stateSortedArray,
        plotData,
    };
}