我需要对一组值进行排序。
var arr = [0.3, 0.76, 0.98, 1.12, 1.36, 1.9];
哪个值最接近1
,这将(在上面的示例中)导致:
[0.98, 1.12, 0.76, 1.36, 0.3, 1.9];
我知道使用自定义排序功能。
arr.sort(function(a, b){
return b - a;
});
我可以控制sort()
如何工作,但是,我不明白我将如何设计自定义函数以便它以所需的方式工作。
也许有人可以启发我。
答案 0 :(得分:16)
只需检查他们与1的距离。
arr.sort(function(a, b){
return Math.abs(1-a) - Math.abs(1-b);
});
只是详细说明,它计算两个数字的距离,即
a=-10
和b=4
,距离分别为11和3。该
函数返回一个正数,所以4之前
排序数组中的-10。a=-1
和b=4,
,距离将为2和3,即函数
返回一个负数,所以-1在数组中的4之前。根据评论中的要求,以下改编将优先考虑低于1的值。
arr.sort(function(a, b){
if(a<1 && b>=1){return -1;}
if(a>=1 && b<1){return 1;}
return (Math.abs(1-a) - Math.abs(1-b));
});
答案 1 :(得分:0)
如果你想要小于1的数字被偏置以排序低于大于1的等距数字,测试delta是否相等并修改其中一个值:
var arr = [1.02, 0.3, 0.76, 0.98, 1.12, 1.36, 1.9, 1.24];
// Unbiased
arr.sort(function(a, b){
return Math.abs(1-a) - Math.abs(1-b);
});
console.log('unbiased: ' + arr); // unbiased: 1.02,0.98,1.12,0.76,1.24,1.36,0.3,1.9
var arr = [1.02, 0.3, 0.76, 0.98, 1.12, 1.36, 1.9, 1.24];
// Biased so numbers less than 1 sort higher than those greater than 1
// where their difference from 1 is equal
arr.sort(function(a, b) {
var da = 1 - a;
var db = 1 - b;
da -= da < 0? 1e-14 : 0;
db -= db < 0? 1e-14 : 0;
return Math.abs(da) - Math.abs(db);
});
console.log('biased: ' + arr); // biased: 0.98,1.02,1.12,0.76,1.24,1.36,0.3,1.9
答案 2 :(得分:0)
只需使用箭头功能实现更新@batscream答案
arr = arr.sort((a, b) => {
return Math.abs(1-a) - Math.abs(1-b);
});
var arr = [0.3, 0.76, 0.98, 1.12, 1.36, 1.9];
arr = arr.sort((a, b) => {
return Math.abs(1-a) - Math.abs(1-b);
});
console.log(arr);
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions