dank-map
Version:
A map function that can map over almost anything.
117 lines (103 loc) • 2.02 kB
JavaScript
/* author - Daniel VerWeire <dverweire@gmail.com>
*
* map - execute function fn for each key in obj. Values returned from fn are appended to an array
* which is returned by the map function
*
* @param {Object} obj
* @param {Function} fn
* @param {Boolean} squash
*
* obj can be an Array or an object.
* fn is a callback function which should be used as described below
* squash determines whether or not to keep falsy returns from fn
*
* When fn is called it is passed the following arguments:
*
* @arg {String} key
* @arg {Object} value
* @arg {Function} emit
* @arg {Function} end
*
* Example:
*
* a = [40,50,2,1];
*
* b = map(a, function (key, val, emit, end) {
* //key is the index in the array
*
* if (val > 10) {
* return val;
* }
* });
*
* // b = [40, 50, null, null];
*
* //this time we will sqash falsy values
* c = map(a, function (key, val, emit, end) {
* //key is the index in the array
*
* if (val > 10) {
* return val;
* }
* }, true); //turn on squash
*
* // b = [40, 50];
*
*/
module.exports = map
function map (obj, fn, squash) {
var a = []
, key
, keys
, x
, doBreak = false;
if (Array.isArray(obj)) {
for (key = 0; key < obj.length; key++) {
doCall(key, obj)
if (doBreak) {
break;
}
}
}
else if (obj !== null && typeof(obj) === 'object') {
keys = Object.keys(obj);
for (x = 0; x < keys.length; x++) {
doCall(keys[x], obj);
if (doBreak) {
break;
}
}
}
else if (typeof(obj) === 'string') {
for (key in obj) {
doCall(key, obj);
if (doBreak) {
break;
}
}
}
else {
return [];
}
return a;
function doCall(key, obj) {
var t = fn.call(
obj[key]
, key
, obj[key]
, emit
, end
);
if ((t !== undefined && t !== null && squash) || !squash) {
a.push(t);
}
}
function emit(t) {
if ((t !== undefined && t !== null && squash) || !squash) {
return a.push(t);
}
}
function end() {
doBreak = true;
}
}