gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:33:00 25 4
gpt4 key购买 nike

我有以下数组:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com