eachOf = function(coll, iteratee, callback) {
    var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric;
    eachOfImplementation(coll, wrapAsync(iteratee), callback);
}
Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument
to the iteratee.

@name eachOf
@static
@memberOf module:Collections
@method
@alias forEachOf
@category Collection
@see [async.each]{@link module:Collections.each}
@param {Array|Iterable|Object} coll - A collection to iterate over.
@param {AsyncFunction} iteratee - A function to apply to each
item in `coll`.
The `key` is the item's key, or index in the case of an array.
Invoked with (item, key, callback).
@param {Function} [callback] - A callback which is called when all
`iteratee` functions have finished, or an error occurs. Invoked with (err).
@example

var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
var configs = {};

async.forEachOf(obj, function (value, key, callback) {
    fs.readFile(__dirname + value, "utf8", function (err, data) {
        if (err) return callback(err);
        try {
            configs[key] = JSON.parse(data);
        } catch (e) {
            return callback(e);
        }
        callback();
    });
}, function (err) {
    if (err) console.error(err.message);
    // configs is now a map of JSON data
    doSomethingWith(configs);
});