function sortBy(coll, iteratee, callback) {
    map(coll, function (x, callback) {
        iteratee(x, function (err, criteria) {
            if (err) return callback(err);
            callback(null, { value: x, criteria: criteria });
        });
    }, function (err, results) {
        if (err) return callback(err);
        callback(null, arrayMap(results.sort(comparator), baseProperty('value')));
    });

    function comparator(left, right) {
        var a = left.criteria,
            b = right.criteria;
        return a < b ? -1 : a > b ? 1 : 0;
    }
}
Sorts a list by the results of running each `coll` value through an async
`iteratee`.

@name sortBy
@static
@memberOf module:Collections
@method
@category Collection
@param {Array|Iterable|Object} coll - A collection to iterate over.
@param {Function} iteratee - A function to apply to each item in `coll`.
The iteratee is passed a `callback(err, sortValue)` which must be called once
it has completed with an error (which can be `null`) and a value to use as
the sort criteria. Invoked with (item, callback).
@param {Function} callback - A callback which is called after all the
`iteratee` functions have finished, or an error occurs. Results is the items
from the original `coll` sorted by the values returned by the `iteratee`
calls. Invoked with (err, results).
@example

async.sortBy(['file1','file2','file3'], function(file, callback) {
    fs.stat(file, function(err, stats) {
        callback(err, stats.mtime);
    });
}, function(err, results) {
    // results is now the original array of files sorted by
    // modified date
});

// By modifying the callback parameter the
// sorting order can be influenced:

// ascending order
async.sortBy([1,9,3,5], function(x, callback) {
    callback(null, x);
}, function(err,result) {
    // result callback
});

// descending order
async.sortBy([1,9,3,5], function(x, callback) {
    callback(null, x*-1);    //<- x*-1 instead of x, turns the order around
}, function(err,result) {
    // result callback
});