interface AnyObject { [index: string]: any; } export function arrayToObject(propName: string, arr: T[]) { return arr.reduce((acc, item: T) => { // @ts-ignore const propValue = item[propName]; acc[propValue] = item; return acc; }, {} as { [index: string]: T }); } export function liftChildren(propName: string, arr: any) { return arr.reduce((acc: any, item: any) => { acc.push(item); if (item[propName] && Array.isArray(item[propName])) { acc.push(...liftChildren(propName, item[propName])); } return acc; }, []); }