diff --git a/package.json b/package.json index 4dc6d61..0f83c4d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/utils", - "version": "0.27.1", + "version": "0.27.2", "description": "Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/objects.ts b/src/objects.ts index 9906cfa..1d3a585 100644 --- a/src/objects.ts +++ b/src/objects.ts @@ -1,22 +1,28 @@ export type Delta = { [key: string]: any | Delta | null }; + /** - * Applies deltas in order to modify `target`. - * @param base - Original - * @param deltas - List of deltas to apply + * Applies deltas to `target`. + * @param base starting point + * @param deltas List of deltas to apply * @returns Mutated target */ -export function applyDelta(base: any, deltas: any): any { - if(deltas === null) return null; - if(typeof base !== 'object' || base === null) return deltas === undefined ? base : deltas; - const result = Array.isArray(base) ? [...base] : { ...base }; - for(const key in deltas) { - const val = deltas[key]; - if (val === undefined) delete result[key]; - else if (typeof val === 'object' && val !== null && !(Array.isArray(val))) result[key] = applyDelta(result[key], val); - else result[key] = val; +export function applyDeltas(base: any, ...deltas: any): any { + function applyDelta(base: any, delta: any): any { + if(delta === null) return null; + if(typeof base !== 'object' || base === null) return delta === undefined ? base : delta; + const result = Array.isArray(base) ? [...base] : { ...base }; + for(const key in delta) { + const val = delta[key]; + if (val === undefined) delete result[key]; + else if (typeof val === 'object' && val !== null && !(Array.isArray(val))) result[key] = applyDelta(result[key], val); + else result[key] = val; + } + return result; } - return result; + + for(let d of deltas) base = applyDeltas(base, d); + return base; } /**