@xassist/xassist-object
Version:
general helper functions for JavaScript objects
342 lines (268 loc) • 9.91 kB
Markdown
# @xassist/xassist-object
general helper functions for JavaScript objects
## Installation
This is a [Node.js](https://nodejs.org/) module available through the
[npm registry](https://www.npmjs.com/). It can be installed using the
[`npm`](https://docs.npmjs.com/getting-started/installing-npm-packages-locally)
or
[`yarn`](https://yarnpkg.com/en/)
command line tools.
```sh
npm install @xassist/xassist-object --save
```
## Usage
### object()
The base function object() creates a new `Class` instance which gives access to some helper Object-functions
```js
object(/*obj:Object*/)
```
note that the `new`- keyword should not be used to create the class-instance.
#### parameters for object()
`object()` takes one (non-optional) parameters:
- **obj**: an Object on which we will execute the underlying methods.
example usage:
```js
object({a:157})
object({hello:"world", ok:true})
```
#### result for object()
`object()` returns following methods:
- `clone()` [function]: very basic cloner for simple objects
- `onChange` [function]: adds a listener to the current object for changes in values
- `assign()` [function]: a polyfill for `Object.assign`
- `mergeUnique()` [function]: changes keys for this.object with given values, kinda similar to assign
- `toArray()` [function]: returns all values for all keys in this.object
- `toMapArray()` [function]: returns all `key,value`-pairs in this.object
- `forEach()` [function]: similar to forEach for Arrays, but iterates over the keys of an object
- `map()` [function]: similar to map for Arrays, but iterates over the keys of an object
the classInstance name is XaObject and is a child-class of EventDispatcher.
It's own attributes are:
- `object` [Object]: the current object, provided via the simple factory-function `object()`
- `currentvalues` [Object]: an intermediate object with the currentvalues of the base object, used for events
### object().clone()
`clone()`is a very basic cloner of objects. It uses `JSON.parse(JSON.stringify(object))` for cloning.
But respecting the limitations this gives us (functions, dates, cyclic references) the cloning of the object will work fairly good and fast.
`clone()`accepts no arguments, and returns a clone of the baseObject.
### object().onChange()
The first method `object().onChange()` sets a listener that will be executed if a value for a given key gets changed
```js
object(obj).onChange(keyName, callBack::function [thisArg])
```
This method accepts 3 parameters. the last one `thisArg` is optional, and defaults to the object (not the classInstance).
#### parameters for object().onChange()
the method `onChange(keyName,callback,thisArg)` accepts 3 parameters.
- **keyName** [String] is an existing key for which the listener should gets executed, if the key does not exists, an Error is thrown
- **callback** [Function]: a listnerfunction which takes 4 parameter
- the new value assigned to the object key
- the old value
- the keyName
- the object
- **thisArg** [optional]:the execution-context of the listener
**** example for object().onChange()
Suppose following initialization:
```js
var b={yes:true}, res=false;
fn=function(value,oldValue,key,Object){ res=(Array.prototype.slice.call(arguments))};
var bObj=object(b);
```
Let's try to add a listener to a change on the key yes for the object b
```js
bObj.onChange("yes",fn)
b.yes=true //nothing get's changed so the listener is not fired
b.yes="finally" //onChange is fired
```
the result being
```js
res===["finally",true,"yes",b]
```
### object().assign()
The method `object().assign()` works the same as the function [`Object.assign()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) in fact it even uses it if this function is available.
This method copiesall own property-values of all objects inside the `arguments-list` to the baseObject.
```js
object(obj).assign(c,null,{e:4})===Object.assign(obj,c,null,{e:4})
```
### object().mergeUnique()
`object().mergeUnique()` does the same as assign it copies all own property values to a target object (ie this.object, the baseObject of `object()`), with this restriction. it only copies the values for properties allready existant in the base (target object).
MergeUnique takes into account the type of the propertyvalue. if the baseobject has `Strings`,`Boolean` or `Numbers` as propertyvalue, the corresponding value in the sourceobject (passed on as argument to `mergeUnique`) will be transformed to this type.
#### parameters for object().mergeUnique()
the method `mergeUnique(sourceObject)` accepts 3 parameters. This is different from assign, cause assign has no limit to the number of parameters
- **sourceObject** [Object] another object from which the values of the properies existent in the targetObject will be copied.
**** result for object().mergeUnique()
the method returns the target object (ie `this.object`). the object that is changed.
**** example for object().mergeUnique()
Suppose following initialization:
```js
var testObject={
number1:1,
number2:2,
number3:3,
number4:4,
number5:5,
number6:6,
txt1:"1",
txt2:"2",
txt3:"3",
txt4:"4",
bool1:true,
bool2:true,
bool3:true,
bool4:false,
bool5:true,
array1:[1,2],
array2:[true]
},
sourceObj={
number1:1.57,
number2:"3",
number3:"r",
number4:false,
number5:true,
number7:-157,
txt1:"ok",
txt2:4,
txt3:true,
bool1:false,
bool2:0,
bool3:"",
bool4:"false",
array1:[1,3]
}
expectedResult={
number1:1.57,
number2:3,
number3:NaN,
number4:0,
number5:1,
number6:6,
txt1:"ok",
txt2:"4",
txt3:"true",
txt4:"4",
bool1:false,
bool2:false,
bool3:false,
bool4:true,
bool5:true,
array1:[1,3],
array2:[true]
};
```
Let's use mergeUnique
```js
object(testObject).mergeUnique(sourceObj);
```
the result being
```js
testObject===expectedResult
```
### object().toArray()
`toArray` returns an array of all values for the own properties of the object.
#### parameters for object().toArray()
`toArray()` takes no parameters.
#### result for object().toArray()
`toArray()` returns an array with all values for each own property of the baseobject.
#### example for object().toArray()
Lets initialize some variables::
```js
var testObject={key1:157,key2:"txt",key3:false}
```
and if we execute `toArray`:
```js
var result=object(testObject).toArray();
```
we will get:
```js
console.log(result)
// [157,"txt",false]
```
### object().toMapArray()
`toMapArray` returns an array with `[key,value]` arrays as its elements.
#### parameters for object().toMapArray()
`toMapArray()` takes no parameters.
#### result for object().toMapArray()
the result of `toMapArray()` is an Array with all key,value pairs.
#### example for object().toMapArray()
lets initialize some variables:
```js
var testObject={key1:157,key2:"txt",key3:false}
```
and if we execute `toMapArray`:
```js
var result=object(testObject).toMapArray();
```
we will get:
```js
console.log(result)
// [[key1,157],[key2,"txt"],[key3,false]]
```
### object().forEach()
`forEach` is similar to the native `Array.prototype.forEach`, it executes a function for each own property of the function.
```js
object(obj).forEach(fn::function [,thisArg])
```
the method accepts 2 parameters, from which the last one (thisArg) is Optional.
#### parameters for object().forEach()
- **fn** [Function]: the function that should be executed on each property of the object. this function accepts following parameters
- the value of the current property
- the name of the property
- the object it self
- **thisArg**: the context in which the function should run, this defaults to the baseObject self
#### result for object().forEach()
forEach returns nothing, it executes a function for each property. If you think it should return anything, look at `map()`
#### example for object().forEach()
Suppose following initialization:
```js
var count=0,
testObject={key1:true,key2:false:key3:true,key4:false},
fn=function(value,keyName,obj){count+= (value&&keyName!="key3")}
```
Let's use forEach
```js
object(testObject).forEach(fn);
```
the result being
```js
count===1
```
### object().map()
`map()` is comparable to the native map on arrays, it returns a new object constructed from the mapped key, value pairs of the baseObject.
```js
object(obj).forEach(fn::function [,thisArg])
```
the method accepts 2 parameters, from which the last one (thisArg) is Optional.
#### parameters for object().map()
- **fn** [Function]: the function that should be executed on each property of the object, it returns the new value for the corresponding key. This function accepts following parameters
- the value of the current property
- the name of the property
- the object it self
- **thisArg**: the context in which the function should run, this defaults to the baseObject self
#### result for object().map()
`map()` returns a new object, it executes a function for each property and those return values are the values for the corresponding properties.
#### example for object().map()
Suppose following initialization:
```js
var testObject={key1:157,key2:"text":key3:true,key4:false},
fn=function(value,keyName,obj){return (typeof value!=='number' && keyName!="key3")}
```
Let's use map
```js
var result=object(testObject).map(fn);
```
the result being
```js
console.log(result)
/*{
key1:false,
key2:true,
key3:false,
key4:true
}*/
```
## Dependencies
- [@xassist/xassist-eventdispatcher](https://ghub.io/@xassist/xassist-eventdispatcher): general eventdispatcher class
## Dev Dependencies
- [rimraf](https://ghub.io/rimraf): A deep deletion module for node (like `rm -rf`)
- [rollup](https://ghub.io/rollup): Next-generation ES6 module bundler
- [tape](https://ghub.io/tape): tap-producing test harness for node and browsers
## License
GPL-3.0