Map `visit` over an array of objects.
npm install map-visit> Map visit over an array of objects.
Install with npm:
``sh`
$ npm install --save map-visit
`js`
var mapVisit = require('map-visit');
Assign/Merge/Extend vs. Visit
Let's say you want to add a set method to your application that will:
* set key-value pairs on a data objectdata
* extend objects onto the object
* extend arrays of objects onto the data object
Example using extend
Here is one way to accomplish this using Lo-Dash's extend (comparable to Object.assign):
`js
var _ = require('lodash');
var obj = {
data: {},
set: function (key, value) {
if (Array.isArray(key)) {
_.extend.apply(_, [obj.data].concat(key));
} else if (typeof key === 'object') {
_.extend(obj.data, key);
} else {
obj.data[key] = value;
}
}
};
obj.set('a', 'a');
obj.set([{b: 'b'}, {c: 'c'}]);
obj.set({d: {e: 'f'}});
console.log(obj.data);
//=> {a: 'a', b: 'b', c: 'c', d: { e: 'f' }}
`
The above approach works fine for most use cases. However, if you also want to emit an event each time a property is added to the data object, or you want more control over what happens as the object is extended, a better approach would be to use visit.
Example using visit
In this approach:
* when an array is passed to set, the mapVisit library calls the set method on each object in the array.visit
* when an object is passed, calls set on each property in the object.
As a result, the data event will be emitted every time a property is added to data (events are just an example, you can use this approach to perform any necessary logic every time the method is called).
`js
var mapVisit = require('map-visit');
var visit = require('object-visit');
var obj = {
data: {},
set: function (key, value) {
if (Array.isArray(key)) {
mapVisit(obj, 'set', key);
} else if (typeof key === 'object') {
visit(obj, 'set', key);
} else {
// simulate an event-emitter
console.log('emit', key, value);
obj.data[key] = value;
}
}
};
obj.set('a', 'a');
obj.set([{b: 'b'}, {c: 'c'}]);
obj.set({d: {e: 'f'}});
obj.set({g: 'h', i: 'j', k: 'l'});
console.log(obj.data);
//=> {a: 'a', b: 'b', c: 'c', d: { e: 'f' }, g: 'h', i: 'j', k: 'l'}
// events would look something like:
// emit a a
// emit b b
// emit c c
// emit d { e: 'f' }
// emit g h
// emit i j
// emit k l
`
* collection-visit: Visit a method over the items in an object, or map visit over the objects… more | homepage
* object-visit: Call a specified method on each value in the given object. | homepage
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
| Commits | Contributor |
| --- | --- |
| 15 | jonschlinkert |
| 7 | doowb |
_(This project's readme.md is generated by verb, please don't edit the readme directly. Any changes to the readme must be made in the .verb.md readme template.)_
To generate the readme, run the following command:
`sh`
$ npm install -g verbose/verb#dev verb-generate-readme && verb
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
`sh``
$ npm install && npm test
Jon Schlinkert
* github/jonschlinkert
* twitter/jonschlinkert
Copyright © 2017, Jon Schlinkert.
Released under the MIT License.
*
_This file was generated by verb-generate-readme, v0.5.0, on April 09, 2017._