下划线:在数组'排序之后,如何保持数组的顺序
Underscore: how to retain the order of this array after it's sorted?
我有以下数组:
var myNumbers = [70.37037037037037, 11.11111111111111, 11.11111111111111, 7.4074074074074066];
我需要将每个数字四舍五入,并且它们的总和为100。如果不足,则按其小数部分的降序加1来弥补差额。这被称为Largest Remainder Method
(我得到了以下代码形式如何使四舍五入的百分比加起来等于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
在你的实现是奇数。
相关文章:
- 如何保持数组格式的值
- 如何按一个仍保持字母顺序的特性值(另一个特性值)对关联数组进行排序
- 在保持元素一致性的同时旋转数组元素的最佳方式'id
- 如何循环数组并保持它们之间的索引增长
- 父数组中每个值的 Angular 指令保持同步
- 如何在 Vue.js 中保持可排序的数组和组件的顺序
- Javascript 数组 // 从指定索引开始对数组重新排序,同时保持原始顺序
- 数组排序.论点从何而来
- 数组保持为空
- Immutable.js:如何在导出到数组时保持不变性
- 复选框事件和保持数组-如何在代码中处理
- 如何获取数组的所有唯一元素,但保持最大重复次数
- 使用Angular将文件异步加载到对象数组中并保持其顺序
- 数组不'不要保持内容,也许是有宣言的东西
- 数组长度保持为0,即使我按下'objects'到它
- 对一串数字进行排序,每个数字里面都有一个字母.确保在原始数组中保持相同的重复项位置
- JavaScript组合了三个2D数组,保持第一个值唯一
- 按值移动数组,保持排序顺序
- 联合数组并保持秩序
- 适当地扩展数组,保持子类的实例