Source: combine.js

import { isarrayofobjects, isgeojson } from "./helpers/helpers.js";

/**
 * @function combine
 * @summary Get the first n Features. The function sort data and returns the nb first elements. If a field is selected, then the function returns the top values. If the entries are strings, then the alphabetic order is applied.
 * @param {object|array} data - An array containig several of GeoJSONs or arrays of objects
 * @param {object} options - Optional parameters
 * @param {boolean} [options.fillkeys = true] - Use true to ensure that all features have all properties.
 * @returns {object|array} -  A GeoJSON FeatureCollection or an array of objects. (it depends on what you've set as `data`).
 * @example
 * geotoolbox.head(*a geojson or an array of objects*)
 */
export function combine(data, { fillkeys = true } = {}) {
  if (data.every((x) => isgeojson(x))) {
    let features = JSON.parse(
      JSON.stringify(data.map((d) => d.features).flat())
    );
    if (fillkeys) {
      let prop = [
        ...new Set(features.map((d) => Object.keys(d.properties)).flat()),
      ];
      features.forEach((feature) => {
        prop.forEach((key) => {
          if (!(key in feature.properties)) {
            feature.properties[key] = undefined;
          }
        });
      });
    }

    return { type: "FeatureCollection", features };
  } else if (data.every((x) => isarrayofobjects(x))) {
    let output = JSON.parse(JSON.stringify(data.flat()));
    if (fillkeys) {
      let prop = [...new Set(output.map((d) => Object.keys(d)).flat())];
      output = output.map((obj) =>
        Object.fromEntries(prop.map((key) => [key, obj[key]]))
      );
    }
    return output;
  }
}