/* * Transforms object with arrays into array of objects * * @param {Record} input - Object with arrays * @param {string[]} ignoredKeys - Keys to ignore * @returns {Record[]} Array of objects * */ export function objectWithArraysToArrayOfObjects(input: Record, arraysToArrays: string[]): Record[] { arraysToArrays.forEach((k) => { // Transform single array to array of arrays and keep array of arrays as is if (Array.isArray(input[k]) && !Array.isArray(input[k][0])) { input[k] = [input[k]]; } }); const keys = Object.keys(input); const maxLength = Math.max( ...keys.map((k) => Array.isArray(input[k]) ? (input[k] as any[]).length : 1 ) ); const output: Record[] = []; for (let i = 0; i < maxLength; i++) { const event: Record = {}; for (const k of keys) { if (Array.isArray(input[k])) { event[k] = (input[k] as any[])[i % (input[k] as any[]).length]; } else { event[k] = input[k]; } } output.push(event); } return output; }; /* * Transforms array of objects into object with arrays * * @param {Record[]} array - Array of objects * @param {Record} mergeObject - Object that is merged to each object in the array * @returns {object} Merged object with arrays * */ export function arrayOfObjectsToObjectWithArrays>(array: T[], mergeObject: Record = {}): Record { return array.reduce((acc, obj) => { Object.keys(mergeObject).forEach((key) => { obj[key as keyof T] = mergeObject[key]; }); Object.keys(obj).forEach((key) => { if (!acc[key as keyof T]) { acc[key as keyof T] = []; } (acc[key as keyof T] as unknown[]).push(obj[key]); }); return acc; }, {} as Record); } /* * Filter certain keys from object * * @param {Record} obj - Object to filter * @param {string[]} filter - Keys to filter * @returns {object} Filtered object * */ export function filterObject(obj: Record, filter: string[]): Record { return Object.fromEntries(Object.entries(obj).filter(([key]) => filter.includes(key))); }