javascript - 下划线: how to retain the order of this array after it's sorted?

标签 javascript underscore.js

我有以下数组:

var myNumbers = [70.37037037037037, 11.11111111111111, 11.11111111111111, 7.4074074074074066];

我需要对每个数字进行四舍五入,并将它们的总和总计为 100。如果未达到要求,则将通过按小数部分递减顺序向项目添加 1 来弥补差额。这称为最大余数方法(我得到了以下代码形式 How to make rounded percentages add up to 100% )。这是获取此内容的下划线代码:

var off = 100 - _.reduce(myNumbers, function(acc, x) {
    return acc + Math.round(x)
}, 0);

var rounded_percentages = _.chain(myNumbers)
    .sortBy(function(x) {
        return Math.round(x) - x
    })
    .map(function(x, i) {
        return Math.round(x) + (off > i) - (i >= (myNumbers.length + off))
    })
    .value();

结果是:

[8, 70, 11, 11]

这很好用,但顺序没有保留。如何实现上述目标,同时保留顺序或使用对象而不是数组执行整个操作并保留正确的键映射?

保留顺序后,结果应该是:

[70, 11, 11, 8]

使用键映射,初始变量将如下所示:

var myNumbers = {
    firstNum: 70.37037037037037,
    secondNum: 11.11111111111111,
    thirdNum: 11.11111111111111,
    fourthNum: 7.4074074074074066
};

结果将是:

{
    fourthNum: 8,
    firstNum: 70,
    secondNum: 11,
    thirdhNum: 11
};

最佳答案

根本不要改变数组的顺序。仅创建一个排列(一个索引数组,然后按每个索引指向的数组值的属性进行排序),并在此基础上运行您的算法。

var rounded_percentages = _.map(myNumbers, Math.floor);
var off = _.reduce(rounded_percentages, function(acc, x) { return acc - x; }, 100);
var permutation = _.sortBy(_.map(myNumbers, function(_, i) { return i; }), function(i) {
    return rounded_percentages[i] - myNumbers[i]; // those with the largest diff first
});
for (var i=0; i<off; i++)
    rounded_percentages[permutation[i]]++

这是最大余数方法的更接近的实现,您的实现中的Math.round是奇怪的。

关于javascript - 下划线: how to retain the order of this array after it's sorted?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33154091/

相关文章:

javascript - 如何使用/解析 JavaScript 字符串中的 HTML 实体和 Unicode 字符

jquery - 使用 Backbone.js 和 Underscore,如何从模型中获取项目数?

javascript - Lodash、Underscore.js 还是 Lazy.js?

javascript - 在 asp.net web 表单中使用下划线模板 _.template()

javascript - 如何将此数组转换为对象数组?

javascript - 比较两个对象中存在的属性

javascript - hoek (hapijs) transform() 是否处理数组?

javascript - 制作 Javascript 简单的幻灯片

javascript - 获取反向地理编码的返回值

javascript - 在 node.js 中将 SVG 代码转换为 PNG 数据 URI