错误展示
function fun1(nums) {
let res = [...new Set(nums)];
for(let i =0 ;i <res.length ;i++){
res[i] = Number(res[i]);
console.log();
}
res.sort(); //(10) [1, 10, 11, 2, 3, 4, 5, 6, 7, 8]
if(res[2] >res[res.length-1] ){
console.log(true);//true
}else{
console.log(false);
}
console.log(res);//(10) [1, 10, 11, 2, 3, 4, 5, 6, 7, 8]
}
fun1([3,2,3,1,2,4,5,5,6,7,7,8,2,3,1,1,1,10,11,5,6,2,4,7,8,5,6])
分析&解决
用sort排序的本意是达到数组变成[1, 2, 3, 4, 5, 6, 7, 8, 10, 11]的结果,后来结果却是[1, 10, 11, 2, 3, 4, 5, 6, 7, 8],开始以为是把数字看成字符进行排序,后来用Number强制转换后发现不行!看了一下别人的sort排序和菜鸟教程,明白了这个原因。
在Javascript数组排序中有一个sort()方法,sort()方法可以说分为两种,一种是文字数组排序,一种是数字数组排序。
在菜鸟教程对sort的描述有这么一句话:
sort() 方法用于对数组的元素进行排序。
排序顺序可以是字母或数字,并按升序或降序。默认排序顺序为按字母升序。
注意:当数字是按字母顺序排列时"40"将排在"5"前面。使用数字排序,你必须通过一个函数作为参数来调用。注意: 这种方法会改变原始数组!。
解决与结果
var thirdMax = function (nums) {
let res = [...new Set(nums)];
res.sort((a,b)=>a-b); //核心语句
console.log(res);
if (res.length < 3) {
console.log(res[res.length-1]);
return res[res.length - 1]
} else {
console.log(res[res.length-3]);
return res[res.length - 3]
}
}; thirdMax([3,2,3,1,2,4,5,5,6,7,7,8,2,3,1,1,1,10,11,5,6,2,4,7,8,5,6])
sort()排序参数的使用
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
所以得出如果想要升序排列的话通过a-b就可以实现 sort((a,b)=>a-b) ,反序也可以通过这个来做到: