繁体   English   中英

对值最接近1的数组进行排序

[英]Sorting an array by which value is closest to 1

我需要对一组值进行排序。

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()如何工作,但是,我不明白我将如何设计自定义函数,以便它以所需的方式工作。

也许有人可以开导我。

只需检查他们与1的距离。

arr.sort(function(a, b){
    return Math.abs(1-a) - Math.abs(1-b);
});

只是详细说明,它计算两个数字的距离,即1

  • a=-10b=4 ,距离分别为11和3。 该函数返回一个正数,因此4在排序数组中位于-10之前。
  • 对于a=-1b=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的数字偏置为低于大于1的等距离数字,请测试增量是否相等并修改其中一个值(如果是:

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

只是用箭头函数实现更新@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM