1. /**
  2. * Merges multiple datasets for monitoring purposes with fallback logic.
  3. *
  4. * @param {...Array<Object>} datasets An array of datasets to merge. Each dataset is an array of objects.
  5. * @param {string} primaryKey The key to use as the primary key for merging.
  6. * @returns {Array<Object>} A merged dataset. Returns an empty array if no datasets are provided.
  7. */
  8. function mergeDatasets(datasets, primaryKey) {
  9. if (!datasets || datasets.length === 0) {
  10. return []; // Return empty array if no datasets are provided
  11. }
  12. const mergedDataset = [];
  13. for (const dataset of datasets) {
  14. if (!Array.isArray(dataset)) {
  15. console.warn("Skipping invalid dataset: Not an array.");
  16. continue; // Skip invalid datasets
  17. }
  18. for (const item of dataset) {
  19. if (typeof item !== 'object' || item === null) {
  20. console.warn("Skipping invalid item: Not an object.");
  21. continue; // Skip invalid items
  22. }
  23. if (!item.hasOwnProperty(primaryKey)) {
  24. console.warn(`Skipping item due to missing primary key: ${primaryKey}`);
  25. continue; // Skip items without the primary key
  26. }
  27. const key = item[primaryKey];
  28. let found = false;
  29. // Check if the item already exists in the merged dataset
  30. for (const existingItem of mergedDataset) {
  31. if (existingItem.hasOwnProperty(primaryKey) && existingItem[primaryKey] === key) {
  32. // Merge the items. Prioritize values from the later datasets.
  33. Object.assign(existingItem, item);
  34. found = true;
  35. break;
  36. }
  37. }
  38. if (!found) {
  39. mergedDataset.push(item);
  40. }
  41. }
  42. }
  43. return mergedDataset;
  44. }

Add your comment