object-lib
Version:
Various object utility functions
135 lines (91 loc) • 4.31 kB
Markdown
[](https://circleci.com/gh/blackflux/object-lib)
[](https://coveralls.io/github/blackflux/object-lib?branch=master)
[](https://dependabot.com)
[](https://david-dm.org/blackflux/object-lib)
[](https://www.npmjs.com/package/object-lib)
[](https://www.npmjs.com/package/object-lib)
[](https://github.com/semantic-release/semantic-release)
[](https://github.com/blackflux/js-gardener)
$ npm install --save-dev object-lib
For more extensive examples, please refer to the tests.
Align the ordering of one object recursively to a reference object.
_Example:_
<!-- eslint-disable import/no-unresolved,import/no-extraneous-dependencies -->
```js
import { align } from 'object-lib';
const obj = { k1: 1, k2: 2 };
const ref = { k2: null, k1: null };
align(obj, ref);
// obj => { k2: 1, k1: 2 }
```
Deep clone object.
Fields targeted by passed needles are created as a reference and not cloned.
Fields targeted by excluded needles are removed entirely from the result.
Needles are declared using the [object-scan](https://github.com/blackflux/object-scan) syntax.
_Example:_
<!-- eslint-disable import/no-unresolved,no-console,import/no-extraneous-dependencies -->
```js
import { clone } from 'object-lib';
const data = { a: {}, b: {}, c: {} };
const cloned = clone(data, ['b', '!c']);
console.log(cloned);
// => { a: {}, b: {} }
console.log(cloned.a !== data.a);
// => true
console.log(cloned.b === data.b);
// => true
```
Check if `subtree` is contained in `tree` recursively.
Different types are never considered _contained_.
Arrays are _contained_ iff they are the same length and every
element is _contained_ in the corresponding element.
Objects are _contained_ if the keys are a subset,
and the respective values are _contained_.
All other types are contained if they match exactly (`===`).
_Example:_
<!-- eslint-disable import/no-unresolved,import/no-extraneous-dependencies -->
```js
import { contains } from 'object-lib';
contains({ a: [1, 2], b: 'c' }, { a: [1, 2] });
// => true
contains({ a: [1, 2], b: 'c' }, { a: [1] });
// => false
```
Deals with parsing invalid json outputs that are commonly generated by llms
Allows merging of objects. The logic defines paths that map to a field, or a function, to merge by.
If a function is passed, it is invoked with the value, and the result is used as the merge identifier.
The paths are defined using [object-scan](https://github.com/blackflux/object-scan) syntax.
_Example:_
<!-- eslint-disable import/no-unresolved,import/no-extraneous-dependencies -->
```js
import { Merge } from 'object-lib';
Merge()(
{ children: [{ id: 1 }, { id: 2 }] },
{ children: [{ id: 2 }, { id: 3 }] }
);
// => { children: [ { id: 1 }, { id: 2 }, { id: 2 }, { id: 3 } ] }
Merge({ '**[*]': 'id' })(
{ children: [{ id: 1 }, { id: 2 }] },
{ children: [{ id: 2 }, { id: 3 }] }
);
// => { children: [ { id: 1 }, { id: 2 }, { id: 3 } ] }
```
Creates a "wrapper" proxy object that errors when a (nested) property is accessed that does not exist.
Normally this would just return "undefined".
### Template(obj: Object)
Takes input "template" obj. This is expected to be a (deeply nested) object.
Rendering works very similar to mustache templates, some features are not supported yet.
For details see tests.
#### variables()
Returns all unique variables in template
#### render(vars: { k: v })
Renders variables into deep copy of obj