defaultsDeep
object
This method is like defaults except that it recursively assigns default properties.
Installation
Import
import { defaultsDeep } from '@tulx/utils';Source Code
Implementation
/**
* This method is like defaults except that it recursively assigns default properties.
*
* @param object - The destination object.
* @param sources - The source objects.
* @returns Returns object.
*
* @example
* ```ts
* defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); // { 'a': { 'b': 2, 'c': 3 } }
* ```
*/
export function defaultsDeep<T extends Record<string, unknown>>(
object: T,
...sources: readonly Record<string, unknown>[]
): T {
const result = object as Record<string, unknown>;
for (const source of sources) {
for (const key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
const sourceValue = source[key];
const objectValue = result[key];
if (objectValue === undefined) {
result[key] = sourceValue;
} else if (
typeof objectValue === 'object' &&
objectValue !== null &&
!Array.isArray(objectValue) &&
typeof sourceValue === 'object' &&
sourceValue !== null &&
!Array.isArray(sourceValue)
) {
defaultsDeep(
objectValue as Record<string, unknown>,
sourceValue as Record<string, unknown>
);
}
}
}
}
return object;
}
Example
import { defaultsDeep } from '@tulx/utils';
defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); // { 'a': { 'b': 2, 'c': 3 } }Related Functions
assign
Assigns own enumerable string keyed properties of source objects to the destination object.
assignIn
This method is like assign except that it iterates over own and inherited source properties.
assignInWith
This method is like assignIn except that it accepts customizer which is invoked to produce the assigned values.
assignWith
This method is like assign except that it accepts customizer which is invoked to produce the assigned values.
at
Creates an array of values corresponding to paths of object.
create
Creates an object that inherits from the prototype object.