foop
Version:
interfaces that describe their intentions.
68 lines (58 loc) • 7.46 kB
JavaScript
// https://github.com/jashkenas/underscore/blob/master/underscore.js#L410
// https://github.com/lodash/lodash/blob/4.7.0-npm-packages/lodash.sortby/index.js#L2079
var isArrayLike = require('../../is/array')
var isUndefined = require('../../is/undefined')
var ObjectKeys = require('../../util/keys')
// External wrapper for our callback generator. Users may customize
// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
// This abstraction hides the internal-only argCount argument.
// var builtinIteratee = function(value, context) {
// return cb(value, context, Infinity)
// }
// var iteratee = builtinIteratee
// An internal function to generate callbacks that can be applied to each
// element in a collection, returning the desired result — either `identity`,
// an arbitrary callback, a property matcher, or a property accessor.
// var cb = function(value, context, argCount) {
// if (iteratee !== builtinIteratee) return iteratee(value, context)
// // if (value == null) return _.identity
// // if (_.isFunction(value)) return optimizeCb(value, context, argCount)
// // if (_.isObject(value) && !_.isArray(value)) return _.matcher(value)
// // return _.property(value)
// }
// _.map = _.collect
// Return the results of applying the iteratee to each element.
var map = function(obj, iteratee, context) {
// iteratee = cb(iteratee, context)
var keys = !isArrayLike(obj) && ObjectKeys(obj)
var length = (keys || obj).length
var results = Array(length)
for (var index = 0; index < length; index++) {
var currentKey = keys ? keys[index] : index
results[index] = iteratee(obj[currentKey], currentKey, obj)
}
return results
}
var sortBy = function(obj, iteratee, context) {
var index = 0
var mapper = function(value, key, list) {
return {
value: value,
index: index++,
criteria: iteratee(value, key, list),
}
}
var sorter = function(left, right) {
var a = left.criteria
var b = right.criteria
if (a !== b) {
if (a > b || isUndefined(a)) { return 1 }
if (a < b || isUndefined(b)) { return -1 }
}
return left.index - right.index
}
// iteratee = cb(iteratee, context)
// _.pluck(returned, 'value')
return map(obj, mapper).sort(sorter)
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydEJ5LmpzIiwic291cmNlcyI6WyJzb3J0QnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2Jsb2IvbWFzdGVyL3VuZGVyc2NvcmUuanMjTDQxMFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjcuMC1ucG0tcGFja2FnZXMvbG9kYXNoLnNvcnRieS9pbmRleC5qcyNMMjA3OVxuY29uc3QgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuLi8uLi9pcy9hcnJheScpXG5jb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uLy4uL2lzL3VuZGVmaW5lZCcpXG5jb25zdCBPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9rZXlzJylcblxuLy8gRXh0ZXJuYWwgd3JhcHBlciBmb3Igb3VyIGNhbGxiYWNrIGdlbmVyYXRvci4gVXNlcnMgbWF5IGN1c3RvbWl6ZVxuLy8gYF8uaXRlcmF0ZWVgIGlmIHRoZXkgd2FudCBhZGRpdGlvbmFsIHByZWRpY2F0ZS9pdGVyYXRlZSBzaG9ydGhhbmQgc3R5bGVzLlxuLy8gVGhpcyBhYnN0cmFjdGlvbiBoaWRlcyB0aGUgaW50ZXJuYWwtb25seSBhcmdDb3VudCBhcmd1bWVudC5cblxuLy8gdmFyIGJ1aWx0aW5JdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0KSB7XG4vLyAgIHJldHVybiBjYih2YWx1ZSwgY29udGV4dCwgSW5maW5pdHkpXG4vLyB9XG4vLyB2YXIgaXRlcmF0ZWUgPSBidWlsdGluSXRlcmF0ZWVcblxuLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gZWFjaFxuLy8gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyB0aGUgZGVzaXJlZCByZXN1bHQg4oCUIGVpdGhlciBgaWRlbnRpdHlgLFxuLy8gYW4gYXJiaXRyYXJ5IGNhbGxiYWNrLCBhIHByb3BlcnR5IG1hdGNoZXIsIG9yIGEgcHJvcGVydHkgYWNjZXNzb3IuXG4vLyB2YXIgY2IgPSBmdW5jdGlvbih2YWx1ZSwgY29udGV4dCwgYXJnQ291bnQpIHtcbi8vICAgaWYgKGl0ZXJhdGVlICE9PSBidWlsdGluSXRlcmF0ZWUpIHJldHVybiBpdGVyYXRlZSh2YWx1ZSwgY29udGV4dClcbi8vICAgLy8gaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBfLmlkZW50aXR5XG4vLyAgIC8vIGlmIChfLmlzRnVuY3Rpb24odmFsdWUpKSByZXR1cm4gb3B0aW1pemVDYih2YWx1ZSwgY29udGV4dCwgYXJnQ291bnQpXG4vLyAgIC8vIGlmIChfLmlzT2JqZWN0KHZhbHVlKSAmJiAhXy5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIF8ubWF0Y2hlcih2YWx1ZSlcbi8vICAgLy8gcmV0dXJuIF8ucHJvcGVydHkodmFsdWUpXG4vLyB9XG5cbi8vIF8ubWFwID0gXy5jb2xsZWN0XG4vLyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudC5cbmNvbnN0IG1hcCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgLy8gaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dClcblxuICBjb25zdCBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgT2JqZWN0S2V5cyhvYmopXG4gIGNvbnN0IGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoXG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheShsZW5ndGgpXG5cbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXhcbiAgICByZXN1bHRzW2luZGV4XSA9IGl0ZXJhdGVlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKVxuICB9XG4gIHJldHVybiByZXN1bHRzXG59XG5cbmNvbnN0IHNvcnRCeSA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgdmFyIGluZGV4ID0gMFxuXG4gIGNvbnN0IG1hcHBlciA9IGZ1bmN0aW9uKHZhbHVlLCBrZXksIGxpc3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWUsXG4gICAgICBpbmRleDogaW5kZXgrKyxcbiAgICAgIGNyaXRlcmlhOiBpdGVyYXRlZSh2YWx1ZSwga2V5LCBsaXN0KSxcbiAgICB9XG4gIH1cbiAgY29uc3Qgc29ydGVyID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWFcbiAgICB2YXIgYiA9IHJpZ2h0LmNyaXRlcmlhXG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhID4gYiB8fCBpc1VuZGVmaW5lZChhKSkgcmV0dXJuIDFcbiAgICAgIGlmIChhIDwgYiB8fCBpc1VuZGVmaW5lZChiKSkgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBsZWZ0LmluZGV4IC0gcmlnaHQuaW5kZXhcbiAgfVxuXG4gIC8vIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpXG4gIC8vIF8ucGx1Y2socmV0dXJuZWQsICd2YWx1ZScpXG4gIHJldHVybiBtYXAob2JqLCBtYXBwZXIpLnNvcnQoc29ydGVyKVxufVxuIl0sIm5hbWVzIjpbImNvbnN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQUEsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7QUFDN0NBLEdBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDO0FBQ2pEQSxHQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0I3Q0EsR0FBSyxDQUFDLEdBQUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFOzs7RUFHM0NBLEdBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQztFQUNqREEsR0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNO0VBQ25DQSxHQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0VBRTdCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDM0MsSUFBSSxVQUFVLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLO0lBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUM7R0FDNUQ7RUFDRCxPQUFPLE9BQU87Q0FDZjs7QUFFREEsR0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0VBQzlDLElBQUksS0FBSyxHQUFHLENBQUM7O0VBRWJBLEdBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtJQUN4QyxPQUFPO01BQ0wsT0FBQSxLQUFLO01BQ0wsS0FBSyxFQUFFLEtBQUssRUFBRTtNQUNkLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7S0FDckM7R0FDRjtFQUNEQSxHQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUNuQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUTtJQUNyQixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUTtJQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7TUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUEsT0FBTyxDQUFDLEVBQUE7TUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUE7S0FDdkM7SUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUs7R0FDaEM7Ozs7RUFJRCxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztDQUNyQzsifQ==