我有一个只有数字作为总和不能超过 100% 的值的对象。但是,我希望每个数字都必须有一个最低数量(比如说 5%);这基本上意味着,如果数组中的一个数字为 0,则将其设置为 5%,然后将该数量分配给所有其他大于 0 的数字。
显然,一个问题是,这可能导致一个数字最初为 6%,然后实际上降低到最小值以下。
目前,我的解决方案是这样的(使用下划线):
var numbers = //this is the object,
adjustedNumbers = {},
// _.objFilter here is just like _.filter, but returns an object instead
// of an array, retaining the key-value pairs
zeroValues = _.objFilter(numbers, function(num){ return num == 0 });
greaterThanTen = _.objFilter(numbers, function(num){ return num >= 10 });
_.each(greaterThanTen, function(ratio, key){
adjustedRangeRatio[key] = ratio - (_.size(zeroValues) / _.size(greaterThanTen)) * 5;
});
_.each(zeroValues, function(value, key){
zeroValues[key] = 5;
}
_.extend(adjustedRangeRatio, zeroValues);
这行得通,但是,它非常丑陋。我确信有一种更好、更清洁、更可扩展的方法来做到这一点。