.. | ||
index.js | ||
LICENSE | ||
package.json | ||
README.md |
map-visit
Map
visit
over an array of objects.
Install
Install with npm:
$ npm install --save map-visit
Usage
var mapVisit = require('map-visit');
What does this do?
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
object - extend objects onto the
data
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
):
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
, themapVisit
library calls theset
method on each object in the array. - when an object is passed,
visit
callsset
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).
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
About
Related projects
- 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
Contributing
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
Contributors
Commits | Contributor |
---|---|
15 | jonschlinkert |
7 | doowb |
Building docs
(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:
$ npm install -g verbose/verb#dev verb-generate-readme && verb
Running tests
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:
$ npm install && npm test
Author
Jon Schlinkert
License
Copyright © 2017, Jon Schlinkert. Released under the MIT License.
This file was generated by verb-generate-readme, v0.5.0, on April 09, 2017.