const filterUnique = () => { const keys = new Set<string>(); return (key: string) => !keys.has(key) ? keys.add(key) || true : false; }; function* fullOuterJoin<L, R, S>(left: L[], right: R[], keyFn: (a: any) => string, selectFn: (left: L, right: R, key: string) => S) { const leftLookup: { [key: string]: L } = {}; const rightLookup: { [key: string]: R } = {}; left.forEach(x => leftLookup[keyFn(x)] = x); right.forEach(x => rightLookup[keyFn(x)] = x); const unique = filterUnique(); const keys = [...left.map(x => keyFn(x)), ...right.map(x => keyFn(x))].filter(unique); for (const key of keys) { const l = leftLookup[key]; const r = rightLookup[key]; yield selectFn(l, r, key); } }; const left = [1, 2, 3, 4]; const right = [3, 4, 5, 6]; for (const item of fullOuterJoin(left, right, (a) => a, (l: number, r: number, k: string) => ({ l, r }))) { console.log('item', item); } const flattenObject = (obj: object): any => { const result = {}; for (const [k, v] of Object.entries(obj)) { if (typeof v === "object" && v) { for (const [x, y] of Object.entries(flattenObject(v))) { result[k + "." + x] = y; } continue; } result[k] = v; } return result; };
441200cookie-checkTypescript / javascript full outer join