A handy collection of methods related to manipulating objects.
Performs a deep copy of the provided input. Supported data types at the moment are: Object, Array, Date, string, number, boolean, and function.
const {clone} = require('@mountaingapsolutions/objectutil');
// Cloneable data types: Object, Array, string, number, boolean, and
// function.
clone([
{name: 'John'},
['nested array'],
'foobar',
42,
true,
() => console.log('hello world')
]);
Similar to Array.filter, but for objects. The filter function will iterate through every key in the object.
const {filter} = require('@mountaingapsolutions/objectutil');
filter({key1: 'foo', key2: 'bar', key3: 'baz'}, (key) => key !== 'key2');
// => {key1: 'foo', key3: 'baz'}
Converts an object to an array. The optional 2rd argument is a custom mapper function to return just a specific subset of each element.
const {toArray} = require('@mountaingapsolutions/objectutil');
const input = {
'MA': {name: 'Massachusetts'},
'ME': {name: 'Maine'},
'NH': {name: 'New Hampshire'}
};
toArray(input)
// => [{name: 'Massachusetts'}, {name: 'Maine'}, {name: 'New Hampshire'}]
toArray(input, (state) => state.name)
// => ['Massachusetts', 'Maine', 'New Hampshire']
Converts an array to an object. The 2nd argument is the key name to use. Defaults to a string index if not provided. Optional 3rd argument is a custom mapper function to return just a specific subset of the object.
const {toObject} = require('@mountaingapsolutions/objectutil');
const input = [
{code: 'MA', name: 'Massachusetts'},
{code: 'ME', name: 'Maine'},
{code: 'NH', name: 'New Hampshire'}
];
toObject(input)
/**
{
'0': {code: 'MA', name: 'Massachusetts'},
'1': {code: 'ME', name: 'Maine'},
'2': {code: 'NH', name: 'New Hampshire'}
}
**/
toObject(input, 'code')
/**
{
MA: {code: 'MA', name: 'Massachusetts'},
ME: {code: 'ME', name: 'Maine'},
NH: {code: 'NH', name: 'New Hampshire'}
}
**/
toObject(input, 'code', (state) => state.name))
/**
{
MA: 'Massachusetts',
ME: 'Maine',
NH: 'New Hampshire'
}
**/
Wraps an object to safely return any object property, ignoring any undefined errors. This is analogous to using the existential operator in TypeScript.
const {safeWrap, unwrap} = require('@mountaingapsolutions/objectutil');
const input = {a: {b: {c: {d: 'value'}}}};
const wrappedInput = safeWrap(input);
unwrap(wrappedInput.a.b.c.d.e.f.g.h)
// => undefined
unwrap(wrappedInput.a.b.c.d)
// => 'value'
Clones the provided array of objects and attempts to update the old object with the updated object by the specified key. If key is not provided, defaults to 'id'.
const {updateIn} = require('@mountaingapsolutions/objectutil');
const original = [{
uuid: 0,
label: 'foo'
}, {
uuid: 1,
label: 'quz',
value: true,
date: ''
}];
const item = {
uuid: 1,
label: 'bar',
value: false,
attribute: ''
};
updateIn(original, item, 'uuid');
/** =>
{
uuid: 1,
label: 'bar',
value: false,
date: '',
attribute: ''
});
*/
Same as updateIn, but if the object to update is not in the array, it will be appended to the cloned array.