sugar
Version:
A Javascript utility library for working with native objects.
41 lines (37 loc) • 1.33 kB
JavaScript
;
var classChecks = require('../../common/var/classChecks'),
getMinOrMax = require('./getMinOrMax'),
serializeInternal = require('../../common/internal/serializeInternal'),
coreUtilityAliases = require('../../common/var/coreUtilityAliases'),
enumerateWithMapping = require('./enumerateWithMapping'),
getReducedMinMaxResult = require('./getReducedMinMaxResult');
var isBoolean = classChecks.isBoolean,
getOwn = coreUtilityAliases.getOwn,
forEachProperty = coreUtilityAliases.forEachProperty;
function getLeastOrMost(obj, arg1, arg2, most, asObject) {
var group = {}, refs = [], minMaxResult, result, all, map;
if (isBoolean(arg1)) {
all = arg1;
map = arg2;
} else {
map = arg1;
}
enumerateWithMapping(obj, map, function(val, key) {
var groupKey = serializeInternal(val, refs);
var arr = getOwn(group, groupKey) || [];
arr.push(asObject ? key : obj[key]);
group[groupKey] = arr;
});
minMaxResult = getMinOrMax(group, !!all, 'length', most, true);
if (all) {
result = [];
// Flatten result
forEachProperty(minMaxResult, function(val) {
result = result.concat(val);
});
} else {
result = getOwn(group, minMaxResult);
}
return getReducedMinMaxResult(result, obj, all, asObject);
}
module.exports = getLeastOrMost;