在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);
理解了么?