CodingGame:JavaScript一行代码得出数组中最接近0的排序(绝对值相同, 负数排在正数前)

  • Post author:
  • Post category:java


在CodingGame上有一道趣味题,有个存放数字的数组,数组中有正负数,要求输出最接近0的数字,我的思路是在数组中挨个取其绝对值,然后与0的差值比较大小,输出最小的那个数字。后面看到很好的解决办法,如下:

var arr=[23,-12,12,34,2,14,-8,22,-1];

arr.sort((a, b) => Math.abs(a) - Math.abs(b) || b - a);


说明

var arr=[23,-12,12,34,2,14,-8,22,-1];
console.log(arr.sort((a, b) => Math.abs(a) - Math.abs(b))); 

输出结果:[-1, 2, -8, -12, 12, 14, 22, 23, 34]

var arr=[23,-12,12,34,2,14,-8,22,-1];
console.log(arr.sort((a, b) => Math.abs(a) - Math.abs(b) || b - a)); 

输出结果:[-1, 2, -8, 12, -12, 14, 22, 23, 34]   //

与上面结果的区别是绝对值相同的数,负数排在正数的后面

这一句代码包含的知识点很多,为了弄清楚,先掌握以下的内容:


① 箭头函数


ES6标准新增了一种函数:Arrow Function(箭头函数)。例如只有一个参数时:

x => x * x

等价于

function (x) {
  return x*x;
}

有两个参数时:

(a, b) => Math.abs(a) - Math.abs(b)

等价于

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

②  abs() 方法:返回数的绝对值

Math.abs(a);// 返回 a 的绝对值. 如果 a 不是数字返回 NaN, 如果 a 为 null 返回 0.

③  sort()方法(可参考

JS基础篇–sort()方法的用法,参数以及排序原理



默认排序顺序是根据字符串


Unicode


码点。


语法:


arrayObject.sort(sortby);


参数


sortby


可选,


sortby


必须是函数,作用是


规定数组的排序顺序(升序或降序),该方法返回排序后的数组, 数组在原数组上进行排序




注:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。

例如:

var arr=[23,-12,34,2,14,-8,22,-1];
console.log(arr.sort());

猜猜它的返回结果是?

输出结果: [-1,-12,-8,14,2,22,23,34] 。单纯的使用sort()方法,可以看出数组没有按照数值的大小进行排序,要实现按大小排序,需使用排序函数




如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:





若 a 小于 b,

则返回一个小于 0 的值。说明

在排序后的数组中 a 出现在 b 之前。



若 a 等于 b,则返回 0。

说明

a 和 b 相等。



若 a 大于 b,则返回一个大于 0 的值。

说明

在排序后的数组中 b 出现在 a 之前。


//升序排序
function sortNumber(a,b)
{
  return a - b;
}
var arr=[23,-12,12,34,2,14,-8,22,-1];
console.log(arr.sort(sortNumber));        //(9) [-12, -8, -1, 2, 12, 14, 22, 23, 34]
//降序排序
function sortNumber(a,b)
{
  return b - a;
}
var arr=[23,-12,12,34,2,14,-8,22,-1];
console.log(arr.sort(sortNumber));        //(9) [34, 23, 22, 14, 12, 2, -1, -8, -12]

④  || 运算符

A || B

开始答题了☺: 0||1  = ?         2||3 = ?

答案分别为1和2。

只要A false,无论B是true或false,均为 B;

A为false的情况有: null, 0, ” “,undefined, false, NaN

只要A true,无论B是true或false,均为 A


最后再看看之前的代码

var arr=[23,-12,12,34,2,14,-8,22,-1];
 
arr.sort((a, b) => Math.abs(a) - Math.abs(b) || b - a);

理解了么?



版权声明:本文为github_34460372原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。