Deeps
Performant utilities to manage deeply nested objects. get, set, flatten, diff etc.
Install / Use
/learn @invertase/DeepsREADME
deeps
<a href="https://twitter.com/mikediarmid"><img src="https://img.shields.io/twitter/follow/mikediarmid.svg?style=social&label=Follow" alt="Follow on Twitter"></a>
High performance utilities for dealing with nested objects.
get (object, path, joiner)
Deep gets an object property value.
const obj = {
some: {
deep: {
prop: 'foobar',
},
},
};
const prop = deeps.get(obj, 'some.deep.prop'); // foobar
const prop = deeps.get(obj, 'some.deep.key'); // undefined
set (object, path, value, initPaths, joiner)
Deep sets an object property value.
const obj = {
some: {
deep: {
prop: 'foobar',
},
},
};
deeps.set(obj, 'some.deep.prop', 'barbaz');
keys (object, joiner)
Same as Object.keys except deeply.
const obj = {
some: {
deep: {
prop: 'foobar',
key: 'barbaz',
},
},
};
const keys = deeps.keys(object); // ['some.deep.prop', 'some.deep.key']
diff (objectA, objectB)
Returns an object of differences between to objects.
const obj1 = {
a: 1,
b: 3,
};
const obj2 = {
a: 2,
b: 3,
};
const diff = deeps.keys(obj1, obj2); // { a: 2 }
merge (target, source)
Same as Object.assign but deeply.
const target = {
a: 1,
b: {
c: 2,
},
};
const source = {
a: 1,
b: {
c: 2,
d: 3,
},
};
deeps.merge(target, source);
// target = { a: 1, b: { c: 2, d: 3 } }
values (object, joiner)
const object = {
a: 1,
b: {
c: 2,
d: 3,
},
};
deeps.values(object); // [1, 2, 3]
flatten (object, joiner)
Flattens an object to an object of key paths with the values
const object = {
a: 1,
b: {
c: 2,
d: {
e: 3,
f: 4
},
},
};
const flatten = deeps.flatten(object);
// flatten:
{
'a': 1,
'b.c': 2,
'b.d.e': 3,
'b.d.f': 4,
}
unflatten
Unflattens an object of key paths (reverse flatten)
const object = {
'a': 1,
'b.c': 2,
'b.d.e': 3,
'b.d.f': 4,
}
const unflatten = deeps.unflatten(object);
// unflatten:
{
a: 1,
b: {
c: 2,
d: {
e: 3,
f: 4,
},
},
};
mapToProps
TODO
Why?
I've been using these utils a lot in personal projects so made sense to move them into a module. (and I wanted to make them more efficient ;p)
Benchmarks
Platform info:
Darwin 15.6.0 x64
Node.JS 6.8.1
V8 5.1.281.84
Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz × 8
DIFF: deeply nested object x 1,305,372 ops/sec ±1.73% (89 runs sampled)
FLATTEN: deeply nested with array x 1,574,470 ops/sec ±1.57% (87 runs sampled)
GET: single depth x 10,753,107 ops/sec ±0.90% (92 runs sampled)
GET: deeply nested with array x 6,302,773 ops/sec ±1.72% (89 runs sampled)
SET: single depth x 7,480,487 ops/sec ±1.91% (84 runs sampled)
SET: deeply nested with array x 6,010,088 ops/sec ±0.91% (93 runs sampled)
Related Skills
node-connect
337.7kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
337.7kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.3kCommit, push, and open a PR
